Как сделать библиотеку, например Q, доступной для всех контроллеров?

Я новичок в 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 в верхней части каждого контроллера, которому он нужен?


person Aaron Storck    schedule 08.03.2014    source источник


Ответы (1)


Вы можете использовать globals для этого. Инициализируйте его где-нибудь в исходном коде или из него (может быть, в верхней части app.js — или из того, что запускается Sails, когда вы «поднимаете», как я думаю, они это называют).

globals.Q = require('q);

См. документ узла по глобальным переменным.

Конечно, вы либо обращаетесь к нему как (например)

var deferred = globals.Q.defer();

который кажется мне неуклюжим. Или,

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

что на самом деле не сэкономит вам больше, чем несколько нажатий клавиш по сравнению с подходом require, поскольку вам все равно нужно явно сделать его доступным через простое имя переменной.

Но это ваши варианты. Вы также можете создать какой-то общий модуль, который загружает все ваши глобальные переменные, например. рассмотрите общий.js

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

А затем в другом файле вы можете просто включить их все сразу.

var c = require('../path/to/common');
var deferred = c.Q.defer();
person barry-johnson    schedule 08.03.2014
comment
Я согласен, что этот подход экономит не более нескольких нажатий клавиш по сравнению с подходом require. Если кто-то предпочитает этот подход, он может определить глобальную переменную в config/bootstrap.js. См. раздел Bootstrap. - person bnuhero; 08.03.2014