【发布时间】:2014-05-09 18:38:40
【问题描述】:
是否可以“插入”丢失的参数(以防它未发送),以便通过req.params.all() 将它们全部持久化?
目前正在尝试这样做,给我一个no method 'setParameter' 错误。
【问题讨论】:
标签: node.js orm sails.js http-request
是否可以“插入”丢失的参数(以防它未发送),以便通过req.params.all() 将它们全部持久化?
目前正在尝试这样做,给我一个no method 'setParameter' 错误。
【问题讨论】:
标签: node.js orm sails.js http-request
以防万一有人需要。
我只需要处理一个类似的问题,我必须在流到达控制器之前将 URL 的某些部分从多种语言翻译成英语。
首先,我使用的是 Sails v0.10.5,但我不知道这会过去多久。
在此版本中,推荐的添加中间件的方法是使用 policy 或 http 配置。
起初我尝试创建一个策略,但 Sails 不允许您更改策略内的参数。因此我求助于http。此配置提供了为 http 请求添加您自己的中间件的可能性。
在那里,您会找到 middleware: 属性,您可以在其中添加自己的函数,然后将其插入到 order 数组中:
order: [
'startRequestTimer',
'cookieParser',
'session',
'myRequestLogger',
'bodyParser',
'handleBodyParserError',
'compress',
'methodOverride',
'poweredBy',
'$custom',
'__your_function',
'router',
'www',
'favicon',
'404',
'500'
]
所以我添加了我自己的函数来订阅router:route 事件,这样 params 数组就已经被填充了。
addRouterListener: function (req, res, next) {
sails.on('router:route', function (args) {
// Proceed to changing your params here
// It would also be wise to check the route or the controller
if (args.options.controller === 'x' && args.req.params['type']){
args.req.params['type'] = translation[args.req.params['type']];
}
});
return next();
}
【讨论】:
如果不实现自定义中间件,就不可能在 Sails 中向 req.params.all() 的结果中添加任何内容,因为它在请求时被解析并在任何用户级代码运行之前提供给路由处理程序。但是,如果您要查找的是默认参数选项,那么在 Sails v0.10.x 中,您可以为此使用 req.options 哈希。例如,如果您想为蓝图“查找”设置默认限制,您可以在 /config/routes.js 中执行以下操作:
'/user': {blueprint: 'find', options: {limit: 10}}
这些选项的文档即将发布,同时您可以examine the source code查看可用的蓝图选项。
对于自定义控制器操作中的默认参数,您可以以类似的方式使用options:
'/foo': {controller: 'FooController', action: 'bar', options: {abc: 123}}
在您的操作代码中,检查选项:
bar: function(req, res) {
var abc = req.param('abc') || req.options.abc;
}
这比使用req.params.all 更可取,因为您可以判断您使用的是用户提供的值还是默认值。但是如果你真的想直接改变参数,你可以通过/config/express.js中的自定义中间件来实现:
customMiddleware: function(app) {
app.use(function(req, res, next) {
// Note: req.params doesn't exist yet because the router middleware
// hasn't run, but we can add whatever we want to req.query and it
// will stick as long as it isn't overwritten by a route param or
// something in req.body. This is the desired behavior.
req.query.foo = req.query.foo || 'bar';
return next();
});
}
【讨论】:
这对我有用,例如在一个控制器中,我想从模型创建新项目以进行数据库插入等:
var requestParams = req.params.all();
requestParams.newParameter = 'XYZ';
requestParams.whatever = '123';
并在需要所有参数+附加参数的地方使用requestParams对象。例如:
MyModel.create(requestParams, function(err, user) {
...
});
【讨论】: