项目场景:
nodejs koa web服务
1、并发请求日志须包含traceId以便方便分析
2、请求周期内用户数据隔离
两种解决办法都可以
- AsyncLocalStorage
用 AsyncLocalStorage 存储 - Context Request
直接在request 中保存
const uuid = require('uuid');
const { AsyncLocalStorage } = require('async_hooks');
const als = new AsyncLocalStorage();
// 在中间件中
app.use(async(ctx, next) => {
// 1 AsyncLocalStorage
const traceId = ctx.request.header['x-trace-id'];
als.enterWith(traceId ? traceId : uuid.v4());
// 2 Context Request
ctx.request._data = {id: uuid.v4()};
// 引用
console.log(`[trace:${als.getStore()}] ->`, ctx.request._data.id) // <----
await next();
});
router.get('/', async(ctx, next) => {
let res = null;
res = await new Promise((resolve, reject) => {
setTimeout(function() {
console.log(`[trace:${als.getStore()}] /=>`, ctx.request._data.id); // <----
resolve(true);
}, 500);
});
});

本文探讨了在Node.js Koa Web服务中如何实现并发请求日志跟踪和用户数据隔离。通过使用AsyncLocalStorage和在request对象中保存数据两种方法,可以有效地管理和跟踪请求。示例代码展示了如何在请求处理过程中生成并使用traceId,以及如何在不同异步操作中保持用户数据的隔离,确保请求生命周期内的数据一致性。
975

被折叠的 条评论
为什么被折叠?



