NodeJS中变量无法在每次请求时重置的问题咨询
为什么Express控制器中的变量会在请求间累加而不重置?
问题场景
我用TypeScript-Node-Starter搭建项目,创建了控制器与路由调用对应函数,代码如下:
import { Request, Response } from "express"; import axios from "axios"; import { parseString } from "xml2js"; let box = 0; export const index = (req: Request, res: Response) => { box++; res.send(JSON.stringify(box)); };
通过npm run watch-node启动服务器后,访问http://localhost:3000/upwork首次返回1,多次刷新后数值持续累加,想知道为什么变量无法在每次请求时重置。
原因分析
box是声明在模块作用域的变量,Node.js的模块加载机制是单例模式——服务器启动时这个模块只会被加载一次,box的初始化(let box = 0)也只会执行一次。之后所有的请求都会共享同一个box变量,每次调用index函数都会对它做自增操作,所以数值会持续累加。
解决方案
根据你的需求选择对应的方案:
- 每次请求都重置为0:把变量移到控制器函数内部,这样每次请求进入函数时都会创建一个新的
box变量:export const index = (req: Request, res: Response) => { let box = 0; box++; res.send(JSON.stringify(box)); }; - 按用户/会话保持状态:如果需要针对不同用户维护独立的数值,使用Express的session机制或者其他会话存储方案,把状态存在用户会话中。
- 全局统计请求次数:如果你的需求本来就是统计该接口的总请求次数,那当前的写法是正确的,不需要修改。
内容的提问来源于stack exchange,提问作者Navjyot Engotra
相关产品推荐
相关产品推荐

