在Express.js中为什么res.json()之后的代码仍然执行?

在使用Express的Node中,我有一段这样的代码。

if (req.body.var1 >= req.body.var2){ res.json({success: false, message: "End time must be AFTER start time"}); console.log('Hi') } console.log('Hi2') //other codes 

我期望,如果var1> = var2,响应将被发送,执行将结束。 像Java / C#中的return语句一样

但是,显然不是这样的。 响应发送后,“Hi”和“Hi2”以及之后的所有其他代码继续执行。

我想知道如何阻止这种情况发生?

另外,我想知道在什么情况下,你真的希望代码在已经发送响应之后继续执行。

干杯

       

网上收集的解决方案 "在Express.js中为什么res.json()之后的代码仍然执行?"

Express只是为匹配的路由调用JavaScript函数。 当function完整/不完整时,没有什么特别的魔法可以知道。 它只是运行该function。 但是,只要你想要退出函数就很容易了…

你可以使用return来停止执行特定路由的callback。 这只是JavaScript …函数将始终尝试运行完成

 app.post('/some/route', (req, res)=> { if (req.body.var1 >= req.body.var2){ // note the use of `return` here return res.json({success: false, message: "End time must be AFTER start time"}); // this line will never get called console.log('Hi') } // this code will only happen if the condition above is false console.log('Hi2') //other codes }); 

有关string比较的警告

你正在使用

 req.body.var1 >= req.body.var2 

所有HTML表单值都以stringforms发送到服务器。

 // javascript string comparison "4" > "3" //=> true "4" > "30" //=> true parseInt("4", 10) > parseInt("30", 10) //=> false 

我敢肯定,你需要做一个比这更受教育的比较。 看起来他们是时间价值? 所以你可能想要将这些值转换为Date对象并做一个准确的比较。

只需在res.json函数之后返回res.json

 res.json({success: false, message: "End time must be AFTER start time"}); return; // This will stop anything else from being run 

你也可以用res.json返回。

 if (req.body.var1 >= req.body.var2){ return res.status(400).json({success: false, message: 'your message'}) }