Node.js 续集挂钩,以任何方式获得Express';用户?

Node.js 续集挂钩,以任何方式获得Express';用户?,node.js,express,sequelize.js,Node.js,Express,Sequelize.js,我正在使用Sequelize和hooks(请参见此处:)。我正在尝试实现一种日志系统,并且更喜欢在钩子上而不是在控制器中登录。有人对如何将我的用户从req.user转换到hooks函数有什么想法吗 db.define('vehicle', { ... }, { hooks: { beforeUpdate: function(values, cb){ // Want to get my user in here. }

我正在使用Sequelize和hooks(请参见此处:)。我正在尝试实现一种日志系统,并且更喜欢在钩子上而不是在控制器中登录。有人对如何将我的用户从req.user转换到hooks函数有什么想法吗

db.define('vehicle', {

    ...

}, {
    hooks: {
        beforeUpdate: function(values, cb){

            // Want to get my user in here.

        }
    }
});

如果用户和车辆之间存在一对多关系,并且如果车辆实例已与用户关联,则可以使用Vehicle.getUser()

如果车辆的一个属性是uid,则为

beforeUpdate: function(vehicle,cb){
  User.find(vehicle.uid)
  .then(function(user){
    console.log(user)
  })
}

否则,必须在控制器中执行此操作。有没有一个很好的理由不在控制器中处理这个问题?在Vehicle上创建一个名为logUser()并接受req.user的类方法似乎是阻力最小的路径。

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

  • 创建具有自定义查询功能的中间件 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; }); };
  • 使用钩子,
    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); } }); addHook(“afterUpdate”),函数(实例){ if(instance.context&&instance.context.user){ log(“用户被“+instance.context.user.id”更改); } });

  • 您可以在这里找到这个过程被提取到express中间件中(我是创建者)。

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

    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);
    });
    

    接受,甚至是去年提出的很难的问题,但它并没有真正回答问题。我正在检查这个解决方案。为您提供信息,我使用TypeScript编写了一个错误
    Object literal可能只指定已知属性,而类型“CreateOptions”中不存在“authInfo”。
    有什么建议吗?我使用“`declare module”sequelize”{interface CreateOptions{authInfo?:Any;}接口更新选项解决了这个问题{authInfo?:any;}接口保存选项{authInfo?:any;}接口BulkCreateOptions{authInfo?:any;}```
    model.create({},{ user: req.user}); // Or
    model.update({},{ user: req.user});
    
    User.addHook("afterUpdate", function(instance, options){
        console.log(' user data', options.user);
    });