如何让所有控制器都可以使用Q等库?

时间:2014-03-08 00:42:57

标签: javascript node.js sails.js waterline

我是Sails / Node的新手,但我使用Q库并行运行查询。例如,我有一个搜索结果的控制器方法,但也提供了响应对象中记录的总数:

search: function(req, res)
{
  //parse parameters      
  var where = req.param('where') || {};
  var limit = req.param('limit')|| 0;
  var skip = req.param('skip') || 0;

  //in case limit or skip are strings, convert to numbers
  if (limit) { limit = +limit; }
  if (skip) { skip = +skip; }

  //prepare query promises for total records and a limited result set
  var countPromise = User.count(where);
  var findPromise = User.find({
    limit: limit,
    skip: skip,
    sort: req.param('sort'),
    where: where
  });

  console.log('Searching Users: limit: '+limit+', skip: '+skip+', where:',where);

  //run asynchronous queries in parallel and
  //return composite JSON object on success
  Q.all([countPromise,findPromise])
    .spread(function(numRecords, matchingRecords){

      console.log(numRecords + " total users found, sending " + matchingRecords.length + " records starting from " + skip + ".");

      //package response
      var response = {};
      response.total = numRecords;
      response.users = matchingRecords || [];

      //send response
      return res.json(response);

    }).fail(function(err){

      //return server error
      return res.serverError(err);
    });
}

虽然Waterline使用下面的Q库,但我必须要求控制器顶部的q库才能使用all方法。有没有办法让Q库可供所有控制器/我的整个应用程序使用?或者我应该在每个需要它的控制器的顶部包含require语句?

1 个答案:

答案 0 :(得分:2)

您可以使用globals来执行此操作。将它初始化在初始代码的某个地方(也可能来自app.js的顶部 - 或者当你解除时Sails运行时,我认为他们称之为)。

globals.Q = require('q);

请参阅node doc on globals

当然,您要么以(例如)

的形式访问它
var deferred = globals.Q.defer();

对我来说很笨拙。或者,

var Q = globals.Q;
var deferred = Q.defer();

除了require方法之外,还没有真正为您节省一些按键,因为您仍然需要通过简单的变量名明确地使其可用。

但这些是你的选择。您还可以创建一些加载所有全局变量的通用模块,例如考虑一下common.js

module.exports = { Q: require('q'),
                 util: require('util') };

然后在另一个文件中,您可以立即将它们全部包含在内。

var c = require('../path/to/common');
var deferred = c.Q.defer();