Javascript 如何使用express在Node JS应用程序中保留请求上下文?

Javascript 如何使用express在Node JS应用程序中保留请求上下文?,javascript,node.js,express,Javascript,Node.js,Express,我的请求对象包含一个唯一的id,我的应用程序中的每个日志都必须具有该id。该id还必须传播到我现在从后端调用的任何API,因为我正在到处传递请求对象。这显然不是一个理想的解决方案。有什么建议吗 代码流 客户端------->服务器(生成请求id,对所有日志使用此id)--->将请求id传递给任何api调用 代码: 您可以使用该模块。还有一个模块,它只是上面的一个小层。但是,不要期望总是完美的……您将遇到cls上下文无效的边缘情况。下面是使用的修订解决方案 这是我的上下文模块。到目前为止,它只存储

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

代码流

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

代码:


您可以使用该模块。还有一个模块,它只是上面的一个小层。但是,不要期望总是完美的……您将遇到cls上下文无效的边缘情况。

下面是使用的修订解决方案

这是我的
上下文
模块。到目前为止,它只存储路径、请求时间和相关ID,如果在请求中没有收到它们,它会生成这些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请求的当前上下文。我将使用它进行一致的日志记录。

代码只是一个示例,说明如何将请求上下文传递给我的日志记录者如果您只需要用于日志记录的请求id,那么只传递请求id而不是整个请求对象如何?我想它会轻量级得多(即一个数字或字符串)。嗨,javascript不是将引用传递给对象,而不是对象本身吗?它真的会对性能产生实质性影响吗?无论如何,我在这里主要关心的是避免在许多api和日志调用中传递额外的参数。感谢您的时间,非常感谢。谢谢,我确实尝试了继续本地存储,但在大多数express routes和api服务调用模块中,它正在丢失上下文。不过我会试试本地请求。有没有其他思路可以完成这项任务?感谢您的帮助,谢谢。
request local
不会让您的运气更好,因为它只是
continuation local storage
上的一个小层。如果您特别注意确保回调函数绑定到正确的CLS名称空间,那么一切都会正常工作,但对于各种Promise库和各种连接池解决方案来说,这可能是一个挑战,等等。我敢肯定,由于Node.js支持异步的本质,没有什么比为Node.js应用程序传递req/res更安全的了。哦,传递参数就是这样。谢谢你的帮助!Patrick,你能评论一下为什么你会遇到cls上下文无效的边缘案例吗?我发现延续本地存储有点不稳定,因为我不能总是检索到我设置为该上下文的数据。感觉这是错误的答案,但我真的不知道为什么。我得再想一想。使用
process.domain
是错误的答案。我有一个使用
延续本地存储
模块的工作解决方案,并将编辑原始答案以反映这一点。
const Context = require('./context');

app.use(Context.setup);