javascript方法链接,从数组中添加方法

javascript method chaining, add methods from an array

本文关键字:方法 添加 数组 链接 javascript      更新时间:2023-09-26

嗨,我想知道你是否可以帮助我动态构建一个方法链,我怀疑如果你知道如何。。。

使用mongoose和node.js,我正在查询一个mongo数据库。我使用了一个函数,我将一个看起来像这样的对象传递给它:

transaction = {
       model: a mongoose model
       req: Express.js request object
       res: Express.js response object
       query: a mongo db query eg, {_id:xxxxx}
       populate: [ {
         field: 'name_of_doc_field'
         select: 'field1,field2'
       } ]
    }

我正在动态构建查询,在函数中,我不知道需要填充多少字段,也不知道是否需要偏移量或限制。

我想连锁我的发现:

transaction.model.find(transaction.query).skip(offset).limit(limit).exec(function(err, collection_obj){...})

我如何动态构建这个链,我需要测试测试对象中是否提供了偏移量,如果它是向链添加.skip方法,等等,使用populate方法,将有一个项目数组,该数组中的每个项目都需要一个新的populate方法添加到链中。

最后,我需要将exec方法添加到链的末尾。

感谢您提前帮助

// Generated by CoffeeScript 1.4.0
    module.exports = {
      findMany: function(transaction) {
        var collection_obj, limit, offset;
        offset = parseInt(transaction.req.query.offset) || 0;
        limit = parseInt(transaction.req.query.limit) || 100;
        collection_obj = null;
        return transaction.model.find(transaction.query).skip(offset).limit(limit).exec(function(err, collection_obj) {
          return found(err, collection_obj, transaction.req, transaction.res);
        });
      },
    }

您可以根据transaction:的内容将链分解为有条件执行的步骤

var q = transaction.model.find(transaction.query);
if (offset) {
  q = q.skip(offset);
}
if (limit) {
  q = q.limit(limit);
}
if (transaction.populate) {
  transaction.populate.forEach(function(pop) {
     q = q.populate(pop.field, pop.select);
  });
}
q.exec(function(err, collection_obj){...});