javascript - 如何使一个库(例如 Q)可供所有 Controller 使用?

标签 javascript node.js sails.js waterline

我对 Sails/Node 有点陌生,但我正在使用 Q 库并行运行查询。例如,我有一个 Controller 方法,它可以搜索结果,而且还提供响应对象中的记录总数:

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 库,但我必须在 Controller 顶部需要 q 库才能使用 all 方法。有没有办法让 Q 库可供所有 Controller /我的整个应用程序使用?或者我应该在每个需要它的 Controller 的顶部包含 require 语句?

最佳答案

您可以使用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();

关于javascript - 如何使一个库(例如 Q)可供所有 Controller 使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22263413/

相关文章:

javascript - Odd Ones Out - 创建一个在原始数组中出现偶数次的项目数组

javascript - JS多维数组空间场

javascript - 如何在异步方法中使用await内部await并在最后返回结果?

node.js - Mongo 聚合查询提取最近 7 天的数据 (node.js)

javascript - 风 sails js : can't create dummy object on bootstrap with Date attribute

javascript - 如何将对象拆分为嵌套对象? (递归方式)

带有 If 语句的 JavaScript 代码

正则表达式 : how to match multiline and closetag

node.js - 类型错误 : Cannot call method 'then' of undefined

javascript - sails.js:如何查找模型内的项目?