Node.js中如何在await前保存上下文?解决KoaJS缓存键错误问题
解决Koa异步中间件中缓存键被覆盖的问题
你的问题核心在于**var声明的变量是函数作用域**,在Koa中间件这种异步场景下,多个并发请求会共享同一个函数作用域的变量:当第一个请求执行到await aSlowFunction()时,JavaScript会让出执行权处理新请求,新请求会修改cacheKey的值,等第一个请求的异步操作完成后,cache.set就会用被修改后的cacheKey,导致缓存键错误。
最简单的解决方法就是把var换成const或let,利用它们的块级作用域特性:每个请求进入中间件函数时,都会创建独立的块级作用域,里面的cacheKey变量完全属于当前请求,不会被其他请求干扰。
修正后的代码如下:
const NodeCache = require("node-cache"); const cache = new NodeCache({ stdTTL: 300 }); app.use(async (message, ctx) => { const cacheKey = message.userName; // 块级作用域变量,每个请求独立 const result = await aSlowFunction(cacheKey); // 按需传递参数给异步函数 cache.set(cacheKey, result); // 此时cacheKey始终是当前请求的原始值 }); async function aSlowFunction(cacheKey) { // 模拟耗时操作,比如数据库查询、API调用 await new Promise(resolve => setTimeout(resolve, 2000)); return `结果-${cacheKey}`; }
另外补充两点:
- 如果你不需要在
aSlowFunction中使用cacheKey,可以不用传递参数,只要保证cacheKey是块级作用域变量即可。 - 这是Node.js异步编程中最常见的作用域陷阱,养成用
const/let替代var的习惯,能避免绝大多数这类问题。
内容的提问来源于stack exchange,提问作者Gray
相关产品推荐
相关产品推荐

