Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Express服务器在5个GET请求后停止_Javascript_Node.js_Reactjs_Typescript_Express - Fatal编程技术网

Javascript Express服务器在5个GET请求后停止

Javascript Express服务器在5个GET请求后停止,javascript,node.js,reactjs,typescript,express,Javascript,Node.js,Reactjs,Typescript,Express,这段代码的工作原理与它应该工作的一样,但是在第五次GET请求之后,它在后端执行它应该执行的操作(将数据存储在db中),但它没有在服务器上记录任何内容,在前端也没有任何更改(reactjs) 对于前五个请求,我得到以下输出: Liked animations: ["/animations/animated-button.html"] GET /animation-list/?username=marko 200 5.152 ms - 54 Liked animations: [

这段代码的工作原理与它应该工作的一样,但是在第五次GET请求之后,它在后端执行它应该执行的操作(将数据存储在db中),但它没有在服务器上记录任何内容,在前端也没有任何更改(reactjs)

对于前五个请求,我得到以下输出:

Liked animations: ["/animations/animated-button.html"]
GET /animation-list/?username=marko 200 5.152 ms - 54
Liked animations: ["/animations/animated-button.html"]
GET /animation-list/?username=marko 304 3.915 ms - -

在此之后,在刷新页面之前,我不会在服务器控制台上获得任何输出,也不会在前端进行任何更改,即使数据库操作仍然有效并且数据已保存。

看起来您有一些问题。首先,此请求处理程序没有正确编码以处理错误,因此它将请求保留为挂起,不发送响应,并且连接将保持挂起状态,直到客户端最终超时。其次,可能存在某种数据库并发使用错误,这是这里的根本问题。第三,您在数据库中没有正确使用
wait
。您可以使用
wait
或将回调传递给数据库,而不是两者都传递。你需要解决这三个问题

为了解决第一和第三个问题:

router.get('/', async(req, res) => {
    try {
        let result = await User.findOne({ username: req.query.username };
        if (result) {
            console.log("Liked animations:", result.likedAnimations);
            res.send({ animationList: result.likedAnimations });
        } else {
            console.log("no database result found");
            res.sendStatus(404);
        }
   } catch(e) {
       console.log(e);
       res.sendStatus(500);
   }
});
对于第二个问题,您提到的特定数据库错误似乎是数据库内部的某种并发/锁定问题,由代码执行的数据库操作序列触发。您可以在中阅读有关该错误的更多信息。由于您向我们展示的代码仅显示一个读取操作,因此我们需要查看更大范围的相关代码上下文,包括与写入数据库的此操作相关的代码,以便能够提供有关如何修复此问题根本原因的任何想法

我们在这里看不到整个流程,但您需要在数据库中使用原子更新操作。您展示的PUT处理程序是一个即时竞态条件。在多客户端数据库中,您不需要获取值,只需修改它,然后将其写回。这是一个竞争条件的机会,因为其他人可以在你坐着的时候修改这个值。然后修改保留值时,将覆盖其他客户端刚才所做的更改。这是比赛条件。相反,您可以使用原子操作直接在一个数据库调用中更新操作,或者使用事务将多步骤操作变为安全操作


我建议你读一下mongodb中的原子操作。而且,您可能希望使用类似于
.findAndModify()
的东西,以便在一个原子操作中查找和更改数据库中的项。如果您搜索“mongodb中的原子操作”,则有许多其他关于该主题的文章。

此请求处理程序有两个根本不发送响应的代码路径。1) 如果
User.findOne()
失败并拒绝,或者2)如果
结果
错误(未找到任何内容)。在这两种情况下,您都应该发送适当的响应。每当发生可疑的事情时,我做的第一件事就是调查我的错误处理,看看是否发生了我处理不当的事情。此外,您可以在服务器上记录所有可能的代码路径,并查看您是否收到请求,如果收到,则查看请求的路径。您可能可以通过更多的日志记录来解决此问题。打开Chrome调试器,查看“网络”选项卡,当您发出这些似乎没有显示任何内容的客户端请求时,服务器将返回给您什么。另外,该代码没有将任何内容保存到数据库?@ChrisG它会触发保存该代码的代码您发布的代码只包含一个读取数据库的查询(User.findOne),没有写入任何内容。否则{console.log(“找不到数据库结果”);res.sendStatus(404);}我添加了此代码,过了一段时间后它会记录此代码(可能在客户端连接结束时),我现在将添加其余的代码,希望现在更容易看到发生了什么on@AndrijaGajic-是的,这就是全面的错误处理和适当的日志记录背后的想法。请记住,您应该从一开始就以这种方式编写服务器端代码,而不仅仅是当您遇到调试问题时。我想您也需要这种类型的日志无论服务器端函数向数据库写入什么,我都会重新加载。所以我最终如何解决这个问题,我的意思是我有很好的错误日志,但问题仍然存在。如果我做对了,问题是操作顺序,客户端会获取旧版本的文档并试图修改它,然后发生冲突?@AndrijaGajic-我们看不到整个fl在这里,您可能需要使用原子更新操作。您显示的PUT处理程序是一个立即竞争条件。在多客户端数据库中,您不会获得值,修改它,然后将其写回。这是一个竞争条件的机会。相反,您使用一个原子操作,直接在一个数据库中更新操作l或者您使用事务将多步骤操作变为安全操作。
router.get('/', async(req, res) => {
    try {
        let result = await User.findOne({ username: req.query.username };
        if (result) {
            console.log("Liked animations:", result.likedAnimations);
            res.send({ animationList: result.likedAnimations });
        } else {
            console.log("no database result found");
            res.sendStatus(404);
        }
   } catch(e) {
       console.log(e);
       res.sendStatus(500);
   }
});