项目服务端用的nodejs,在高并发(1000人同时访问)情况下会出现返回用户数据错乱的问题; 项目调用了微信登陆接口,微信结果返回后,将用户信息(用户id等)用 jsonwebtoken 签名成token返回客户端,客户端每次请求都会在请求头带上该token。服务端解析token获取用户id等敏感信息后再从mongodb数据库中获取信息返回客户端 高并发情况下,同样的token,后端返回的数据偶尔出现错乱,用户A拿到的是用户B的数据。在访问人数不多的情况下又不会出现该问题,生成的token值应该是不会重复的。 服务器用的Window serve 2012 用IIS反向代理到node服务,node服务用forever守护进程。
这是生成token的代码: ** let content = { _id: user._id }; // 要生成token的主题信息 let secretOrPrivateKey = global.tokenKey;// 这是加密的key(密钥) let token = jwt.sign(content, secretOrPrivateKey, { expiresIn: 60 * 60 * 4 // 4小时过期 }); res.jsonp({ status: 1, mess: ‘ok’, token: token, }) //返回token**
这是解密token的中间件: let token = req.get("Authorization"); // 从Authorization中获取token let secretOrPrivateKey = global.tokenKey; // 这是加密的key(密钥) jwt.verify(token, secretOrPrivateKey, (err, decode)=> { if (err) { // 时间失效的时候 || 伪造的token res.send({‘status’:0,mess:"登录超时,请重新进入"}); } else { req.query.userInfo = decode;//记录解析出来的数据 next(); } })
**有大佬遇到过类似的问题么?困扰我很久了,望解答,下面附上部分代码,谢谢~!**@759729757 通过这几行代码看不出来问题。可以提供一个思路进行排查 1、异步编程要多考虑"代码重入"的问题。比如,同样一段代码,当await执行某些io时,其他用户环境的io先执行完,会重入到这段代码中。 2、因为"代码会重入",所以变量的声明和使用要多注意。多建议用局部变量或者ctx环境变量,如果一定要用类似全局状态的变量,就要考虑重入的影响