来自 API 的 2 个并发请求数据被混淆

2 concurrent requests data from API were mixed up

本文关键字:数据 请求 并发 API 来自      更新时间:2023-09-26

我使用 Nodejs 作为我的应用程序 API 的后端,但我意识到当有 2 个不同的用户继续使用相同的方法请求时,MySQL 请求返回的数据有时可能会混淆,这是我的代码:

router.get('/v1/getList', function(req, res) {
    model.getList(loginUser, function(groups){
        if(!groups.length){
            res.json({data: '', success: false, message: 'No record found.'});
        } else{
            console.log("User:"+loginUser+", Length:"+groups.length);
            res.json({data: groups, success: true, message: ''});                    
        }
    });
});

loginUser是用户 ID。在正常情况下,终端输出将如下所示,用户 1 有 2 个项目,用户 2 有 3 个项目:

User:1, Length:2
User:2, Length:3
User:1, Length:2
User:2, Length:3
and so on...

但是一旦我不断刷新屏幕,终端可能会返回:

User:1, Length:2
User:2, Length:3
User:1, Length:3
User:2, Length:2

我怀疑用户 2 的数据请求正在被用户 1 访问,反之亦然,我可以知道如何解决这个问题吗?

不能使用全局变量来存储中间件中的loginUser。 可以同时有多个请求在传输中。 像这样的全局混合了来自多个请求的数据。

解决此问题的常用方法是将数据存储在中间件中的request对象本身中。 然后,您可以从实际请求处理程序访问 request 对象上的该属性。 由于请求对象对于此特定请求是唯一的,因此来自不同用户的请求之间没有数据交叉耦合。

您的请求处理程序变为以下内容(使用 req.loginUser):

router.get('/v1/getList', function(req, res) {
    model.getList(req.loginUser, function(groups){
        if(!groups.length){
            res.json({data: '', success: false, message: 'No record found.'});
        } else{
            console.log("User:"+loginUser+", Length:"+groups.length);
            res.json({data: groups, success: true, message: ''});                    
        }
    });
});

而且,您必须修改中间件以设置req.loginUser而不是全局变量。