我开始编写一个钩子来覆盖res.ok()
返回的json格式。最好的方法是什么?我想避免更改api/responses
中的文件,而是覆盖它们,如果可能的话。
hooks README未在两年内更新,但提到:
- 自定义API响应(来自v0.10:第2阶段 - 不稳定)
现在可以吗?看起来默认钩子使用hook.middleware = responseDefs;
,这是一个可安装钩子的可行选项吗?
答案 0 :(得分:0)
我对我的解决方案并不完全满意,但我能够从核心中删除一些辅助函数,这些函数在所有其他挂钩加载后将我的响应绑定到路由。
特别是,我从moduleloader复制并调整了loadResponses
和bindToSails
:
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/