Sequelize钩子,以任何方式获得Express'用户?

时间:2013-10-30 12:14:39

标签: node.js express sequelize.js

我正在使用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.

        }
    }
});

3 个答案:

答案 0 :(得分:3)

尽管这是一个老问题,但这是我的答案。问题是让当前用户从你的请求进入钩子。这些步骤可能使您获得:

  1. 使用自定义查询功能创建中间件
    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;
      });
    };
    
  2. 使用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);
    });
    
  3. 使用您的钩子,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);
       }
    });
    
  4. 您可以在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似乎是阻力最小的路径。