如何使用express保留Node JS App中的请求上下文?

时间:2015-09-18 15:35:19

标签: javascript node.js express

我的请求对象包含一个唯一的ID,我的应用程序中的每个日志都必须具有此ID。此ID也必须传播到我从后端调用的任何API现在,我将请求对象传递到任何地方。这显然不是一个理想的解决方案。有什么建议吗?

代码流程

客户端------->服务器(生成请求ID,将其用于所有日志)----->将请求ID传递给任何api调用

代码:

app.use(function(req,res,next) {    
  logger.info("My message",req);
});

2 个答案:

答案 0 :(得分:2)

您可以使用continuation-local-storage模块。还有request-local模块,它只是continuation-local-storage之上的一个小层。不要期望continuation-local-storage永远是完美的......你会遇到cls上下文无效的边缘情况。

答案 1 :(得分:1)

以下是使用continuation-local-storage module的修订解决方案。

这是我的context模块。到目前为止,它只存储它生成的路径,请求时间和相关ID,如果它在请求中没有收到它。

'use strict';

const continuation = require('continuation-local-storage');
const cuid = require('cuid');

const appName = require('config').get('app_name');

class Context {

    static setup(req, res, next) {
        const session = continuation.createNamespace(appName);
        session.run(() => {
            session.set('context', new Context(req));
            next();
        });
    }

    constructor(req) {
        this.path = req.path;
        this.corrId = req.headers['x-correlation-id'] || cuid();
        this.requestTime = Date.now();
    }

    static current() {
        return continuation.getNamespace(appName).get('context');
    }
}

module.exports = Context;

我的app.js包括:

const Context = require('./context');

app.use(Context.setup);

之后,任何代码都可以调用Context.current()来获取Express请求的当前上下文。我将使用它来进行一致的记录。