假设我有这个模型:
module.exports = {
attributes: {
title: {
type: 'string',
required: true
},
content: {
type: 'string',
required: true
},
createdBy: {
type: 'string',
required: true
}
}
}
我需要将当前用户ID设置为模型的createdBy属性。我以为我可以使用beforeValidate生命周期回调来做到这一点,但我无法访问存储当前用户的请求对象。有没有办法访问它,或者我应该以其他方式解决这个问题?
我试过这个没有成功:
beforeValidate: function (values, next) {
var req = this.req; // this is undefined
values.createdBy = req.user.id;
next();
}
答案 0 :(得分:10)
由于请求超出了ORM的范围,我猜测我的方法是错误的,我需要将createdBy数据添加到中间件中的req.body。但由于每次请求都没有这样做,我猜想用策略做这件事会更好。像这样:
PostController: {
'*': ['passport', 'sessionAuth'],
create: ['passport', 'sessionAuth',
function (req, res, next) {
if (typeof req.body.createdBy === 'undefined') {
req.body.createdBy = req.user.id;
}
next();
}
]
}
这样我就不需要覆盖蓝图。
答案 1 :(得分:1)
你可以用两种方式做到这一点。
首先是在控制器中添加该数据。像
这样的东西// /api/controllers/mycontroller.js
module.exports = {
new: function(req, res) {
if (typeof req.user.id !== 'undefined') {
req.body.createdBy = req.user.id; // req.body or req.params
}
MyModel.create(req.body /* ... */)
}
}
如果您使用MyModel
进行大量数据操作,则可能会令人讨厌。因此,您可以向模型添加静态方法,以使用用户ID保存它。类似的东西:
// /api/models/myModel.js
module.exports = {
attributes: {/* ... */},
createFromRequest: function(req, cb) {
// do anything you want with your request
// for example add user id to req.body
if (typeof req.user.id !== 'undefined') {
req.body.createdBy = req.user.id;
}
MyModel.create(req.body, cb);
}
}
并在控制器中使用它
// /api/controllers/mycontroller.js
module.exports = {
new: function(req, res) {
MyModel.createFromRequest(req, function(err, data) {
res.send(data);
});
}
}
答案 2 :(得分:-1)
Sails故意不会将req
和res
个对象暴露给生命周期回调,这意味着您不应该执行您尝试做的事情。
如果您尝试设置用户ID,可以将该ID添加到sails策略中的req.query
对象;然后,如果您只使用标准REST端点,则ID将自动添加到模型中。我的sails-auth模块做了类似的事情。