Nodejs 怎么通过请求上下文异步传递信息

发布于 1周前 作者 zlyuanteng 来自 nodejs/Nestjs

目前使用了 express-http-context2 , 但是感觉有 bug ,在后续中无法获取设置的值

const app = express();
app.use(middleware); // use http context

if (!excludeAuth(req)) { await verifyJWT(req, resp); console.log(get(HTTP_CONTEXT.ORG_ID)); }


Nodejs 怎么通过请求上下文异步传递信息

4 回复

https://www.npmjs.com/package/express-http-context

感觉可能是写法问题? 检查版本
1. Install: npm install --save express-http-context
(Note: For node v4-7, use the legacy version: npm install --save express-http-context@<1.0.0)

2. Make sure you require express-http-context in the first row of your app. Some popular packages use async which breaks CLS.

3. Node 10.0.x - 10.3.x are not supported. V8 version 6.6 introduced a bug that breaks async_hooks during async/await. Node 10.4.x uses V8 v6.7 in which the bug is fixed. See: https://github.com/nodejs/node/issues/20274.


后面尝试了下,设置值不在 await 方法里可以获取,可能是跟这个上下是基于回调有关系,具体原因还没搞明白

ps:感谢楼上

没必要用这个插件啊,直接用 asynclocalstorage 一样简单,还可以自定义 type

在Node.js中,通过请求上下文异步传递信息通常涉及使用中间件或请求对象本身来存储和访问数据。在Express框架中,可以利用res.locals对象或自定义中间件来实现这一点。下面是一个简单的示例,展示了如何通过中间件和res.locals在请求上下文中异步传递信息。

const express = require('express');
const app = express();

// 中间件,用于设置上下文信息
app.use((req, res, next) => {
  res.locals.contextData = { message: 'Hello, this is context data!' };
  next();
});

// 异步路由处理函数
app.get('/', async (req, res) => {
  // 模拟异步操作,如数据库查询
  setTimeout(() => {
    // 访问并使用上下文信息
    console.log(res.locals.contextData.message);
    res.send(`Message from context: ${res.locals.contextData.message}`);
  }, 1000);
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

在这个例子中,我们使用了一个中间件来设置res.locals.contextData。在路由处理函数中,我们模拟了一个异步操作(使用setTimeout),并在这个异步操作中访问了res.locals.contextData

这种方法利用了Express的请求响应周期,确保上下文信息在异步操作期间仍然可用。res.locals是一个专门用于在请求响应周期内共享数据的对象,非常适合用于传递上下文信息。

回到顶部