【问题标题】:javascript method chaining, add methods from an arrayjavascript方法链接,从数组中添加方法
【发布时间】:2013-02-04 03:25:36
【问题描述】:

您好我想知道您是否可以帮助我动态构建方法链,如果您知道如何,我怀疑这很容易做到......

我正在使用 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 方法添加到链等,并且使用填充方法,将有一个项目数组,该数组中的每个项目都需要一个新的填充方法添加到链中。

最后,我需要一个 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);
        });
      },
    }

【问题讨论】:

  • 您的 API 对我来说似乎很模糊。你说transaction.model 是猫鼬模型。是否已经具有您正在寻找的find 功能?如果没有,您是否希望扩展 mongoose API?
  • 您想让skiplimitexec 方法作用于transaction 还是作用于model
  • 我分离这个功能的原因是我会在很多型号上重复这个功能。我想在给定模型中查找记录,该模型由事务对象提供。我是不是误解了什么?它按目前的方式工作,但不处理缺失的属性,例如缺失的“限制”,也不运行 .populate 方法,因为我不知道如何为数组。
  • 是的,对不起,猫鼬模型已经有了查找功能。

标签: javascript node.js express mongoose


【解决方案1】:

您可以根据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){...});

【讨论】:

  • 这似乎确实有效,您可能会说我是 javascript 新手。据我了解,链接是有效的,因为下一个方法继承了前一个方法的对象输出。所以在这里,我们只是设置对象“q”并不断向它添加新方法。 exec 方法必须检查附加到 q 的所有其他方法。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
  • 2015-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多