6

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

        }
    }
});
4

3 回答 3

5

我在我的项目中使用了一种简单的解决方案。

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);
});
于 2018-05-31T10:20:03.550 回答
4

尽管这是一个老问题,但这是我的答案。问题是将当前用户从您的请求中获取到钩子中。这些步骤可能使您能够做到:

  1. 使用自定义查询函数创建中间件
    req.context.findById = 函数(模型){
      // 从参数中剥离模型
      Array.prototype.shift.apply(arguments);
      // 应用原始函数
      return model.findById.apply(model, arguments).then(function(result){
        结果.context = {
          用户:req.user
        }
        返回结果;
      });
    };
    
  2. 做你的 put 使用req.findById(model, id)而不是User.findById(id)
    app.put("/api/user/:id", app.isAuthenticated, function (req, res, next) {
       // 这里是重要的部分,用户 req.context.findById(model, id) 而不是 model.findById(id)
       req.context.findById(User, req.params.id).then(function(item){
          // item.context.user 现在是 req.user
          如果(!用户){
             return next(new Error("ID 为 " + id + " 未找到的用户"));
          }
          user.updateAttributes(req.body).then(function(user) {
             res.json(用户);
          }).catch(下一个);
       }).catch(下一个);
    });
    
  3. 使用你的钩子,instance.context.user将可用
    User.addHook("afterUpdate", function(instance){
       如果(instance.context && instance.context.user){
          console.log("一个用户被" + instance.context.user.id);
       }
    });
    

您可以在https://github.com/bkniffler/express-sequelize-user(我是创建者)中找到提取到快速中间件中的此过程。

于 2015-08-01T15:59:35.093 回答
0

如果用户和车辆之间存在一对多的关系,并且如果 Vehicle 的实例已经与用户关联,那么您可以使用 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 似乎是阻力最小的路径。

于 2014-09-19T17:52:00.717 回答