我正在使用Sequelize和钩子(见这里:https://github.com/sequelize/sequelize/pull/894)。我正在尝试实现一种日志系统,并且更愿意登录钩子而不是我的控制器。任何人对如何将我的用户从req.user引入我的钩子函数有什么想法?
db.define('vehicle', {
...
}, {
hooks: {
beforeUpdate: function(values, cb){
// Want to get my user in here.
}
}
});
答案 0 :(得分:3)
尽管这是一个老问题,但这是我的答案。问题是让当前用户从你的请求进入钩子。这些步骤可能使您获得:
req.context.findById = function(model){ // Strip model from arguments Array.prototype.shift.apply(arguments); // Apply original function return model.findById.apply(model, arguments).then(function(result){ result.context = { user: req.user } return result; }); };
req.findById(model, id)
代替User.findById(id)
进行投放
app.put("/api/user/:id", app.isAuthenticated, function (req, res, next) { // Here is the important part, user req.context.findById(model, id) instead of model.findById(id) req.context.findById(User, req.params.id).then(function(item){ // item.context.user is now req.user if(!user){ return next(new Error("User with id " + id + " not found")); } user.updateAttributes(req.body).then(function(user) { res.json(user); }).catch(next); }).catch(next); });
instance.context.user
将可用
User.addHook("afterUpdate", function(instance){ if(instance.context && instance.context.user){ console.log("A user was changed by " + instance.context.user.id); } });
您可以在https://github.com/bkniffler/express-sequelize-user(我是创作者)中找到提取到快速中间件中的此过程。
答案 1 :(得分:3)
我在项目中使用了一个简单的解决方案。
1)首先,当您创建或更新任何模型时,请在选项参数中传递数据,如下所示:
model.create({},{ user: req.user}); // Or
model.update({},{ user: req.user});
2)然后,在钩子
中访问你的数据User.addHook("afterUpdate", function(instance, options){
console.log(' user data', options.user);
});
答案 2 :(得分:0)
如果用户和车辆之间存在一对多关系,并且车辆实例已经与用户关联,那么您可以使用vehicle.getUser()。
...
beforeUpdate: function(vehicle,cb){
vehicle.getUser()
.then(function(user){
console.log(user)
})
}
如果车辆的一个属性是uid。
beforeUpdate: function(vehicle,cb){
User.find(vehicle.uid)
.then(function(user){
console.log(user)
})
}
否则必须在控制器中完成。有没有充分的理由不在控制器中处理这个?在Vehicle上创建一个名为logUser()的类方法,它接受req.user似乎是阻力最小的路径。