【问题标题】:Sequelize get request data in hooks?Sequelize 在钩子中获取请求数据?
【发布时间】:2016-02-27 22:40:13
【问题描述】:

我正在尝试为我的模型存储一些关于创建、更新、删除调用的日志数据。我想在请求中存储一些来自请求的数据以及一些用户数据(使用 express.js)。

在挂钩中,我有一些用于日志记录的模块。

hooks: {
    afterCreate: function (order, options, done) {
        // How to get user data stored in express request.

        return app.log.set('event', [{message: 'created', data: order, userId: 1}, done]);
    }
}
...

该模块只是在表格中创建记录。然而,这是我遇到问题的userId 部分。我正在使用passport 模块,它存储在请求中,那么如何将用户对象(或任何外部对象)放入模型挂钩中?

我想避免在控制器或其他任何地方执行此操作,因为可能有一些脚本或其他命令也可能输入数据。

【问题讨论】:

    标签: javascript node.js express sequelize.js


    【解决方案1】:

    我也遇到过类似的问题,我自己解决如下:

    首先:我声明了一个全局(通用)钩子:

    module.exports = sequelize.addHook('beforeCreate',
      function(model, options, done) {//hook 2
        //handle what you want
        //return app.log.set('event', [{message: 'created', data: order,      userId: 1}, done]);
    });
    

    然后,在调用模型之前,使用调用钩子(beforeCreatebeforeBulkUpdate,...)并分配参数请求

    module.exports = {
      CreateUser: function(req, res) {
        User.beforeCreate(function(model, options, done) {//hook1
            model.request = req;
        });
        User.create({
                id: 1,
                username: 'thanh9999',
                password: '31231233123'
                    //ex.....
            })
            .then(function(success) {
                //response success
            }, function(err) {
                //response error
            });
       }
    };
    

    调用钩子的顺序:hook declaration in model → 钩子 1 → 钩子 2`。

    此外,您还必须为每个模型声明挂钩。 See more information here.

    【讨论】:

    • 虽然传递 req 是一个有效且透明的解决方案,但我发现仅仅为了记录而这样做既奇怪又烦人。您可能需要检查 continuation-local-storage (npmjs.com/package/continuation-local-storage) 来存储数据,以便每个 logger.log 函数都可以访问它被调用的任何位置。理论上它应该有效,在实践中 - 从未尝试过。
    猜你喜欢
    • 2021-06-06
    • 1970-01-01
    • 2021-09-05
    • 2018-05-16
    • 2012-12-08
    • 2022-07-29
    • 2017-02-05
    • 2014-01-01
    • 1970-01-01
    相关资源
    最近更新 更多