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

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

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语句?

你可以使用globals来做到这一点。 在你最初的代码的某个位置初始化它(app.js的顶部也许 – 或者当你“举起”时,从我们认为他们称之为的Sails运行)。

 globals.Q = require('q); 

查看全局节点doc 。

当然,你要么作为(例如)

 var deferred = globals.Q.defer(); 

这对我来说感觉笨重。 要么,

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

这并不能真正为您节省更多的关于require方法的操作,因为您仍然需要通过简单的variables名来明确地使其可用。

但这些是你的select。 你也可以创build一个加载所有全局variables的通用模块,例如common.js

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

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

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