在Installable Hook中定义自定义API响应

时间:2015-07-31 01:57:41

标签: sails.js

我开始编写一个钩子来覆盖res.ok()返回的json格式。最好的方法是什么?我想避免更改api/responses中的文件,而是覆盖它们,如果可能的话。

hooks README未在两年内更新,但提到:

  
      
  • 自定义API响应(来自v0.10:第2阶段 - 不稳定)
  •   

现在可以吗?看起来默认钩子使用hook.middleware = responseDefs;,这是一个可安装钩子的可行选项吗?

1 个答案:

答案 0 :(得分:0)

我对我的解决方案并不完全满意,但我能够从核心中删除一些辅助函数,这些函数在所有其他挂钩加载后将我的响应绑定到路由。

特别是,我从moduleloader复制并调整了loadResponsesbindToSails


let buildDictionary = require('sails-build-dictionary');
let path = require('path');
let _ = require('lodash');

function bindToSails(sails, cb) {
  return function (err, modules) {
    if (err) {
      return cb(err);
    }
    _.each(modules, function (module) {
      // Add a reference to the Sails app that loaded the module
      module.sails = sails;
      // Bind all methods to the module context
      _.bindAll(module);
    });
    return cb(null, modules);
  };
}


/**
 * Load custom API responses.
 *
 * @param {Object} options
 * @param {Function} cb
 */
exports.loadResponses = function (sails, cb) {
  buildDictionary.optional({
    dirname              : path.resolve(__dirname + '/../responses'),
    filter               : /(.+)\.js$/,
    useGlobalIdForKeyName: true
  }, bindToSails(sails, cb));
};

然后,从我的钩子定义中,我把:

loadModules: function (cb) {
  let hook = this;
  moduleUtils.loadResponses(sails, function (err, responseDefs) {
    if (err) return cb(err);
    // Register responses as middleware
    hook.middleware.responses = responseDefs;
    return cb();
  });
},

/**
 * Shadow route bindings
 * @type {Object}
 */
routes: {
  before: {

    /**
     * Add custom response methods to `res`.
     *
     * @param {Request} req
     * @param {Response} res
     * @param  {Function} next [description]
     * @api private
     */
    'all /*': function addResponseMethods(req, res, next) {
      // Attach custom responses to `res` object
      // Provide access to `req` and `res` in each of their `this` contexts.
      _.each(sails.middleware.jsonapi.responses, function eachMethod(responseFn, name) {
        sails.log.silly('Binding response ' + name + ' to ' + responseFn);
        res[name] = _.bind(responseFn, {
          req: req,
          res: res,
        });
      });
      // Proceed!
      next();
    }
  }
}

jsonapi是我的钩子的名称。您可以在https://github.com/IanVS/sails-hook-jsonapi/

中查看整个过程