在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只是为匹配的路由调用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'}) }