我已经阅读了S.O.对这个问题的一些回答。 (here)和here,我想知道这是否是最好的方法,或者是否有更普遍接受的最佳做法。因此,如果我有以下代码,例如:
app.delete('/something/:somethingId', function (req, res) {
for (var i = 0; i < thingList.length; i++) {
if (thingList[i].id === req.params.somethingId) {
thingList.splice(i, 1);
res.send(thingList[i]);
}
}
res.send("Nothing with that ID found");
});
此错误带有“设置后无法设置标头”我相信因为res.send()
是异步的,并且此代码将尝试运行外部res.send()
,而内部版本已经开始发送过程。但是,我不能将外部res.send()
放在else
块中,因为它会在它应该之前从我的循环中踢出。所以添加return
语句是这样的:
...
for (var i = 0; i < thingList.length; i++) {
if (thingList[i].id === req.params.somethingId) {
thingList.splice(i, 1);
return res.send(thingList[i]);
}
}
res.send("Nothing with that ID found");
...
或者,或者:
...
res.send(thingList[i]);
return;
...
我有最好的选择吗?我正在向一些人教这个,并希望在给他们一个可能被认为是黑客的解决方案之前确保我做对了。
答案 0 :(得分:2)
返回Node中的回调是一个常见的约定 - 所以是的,这是一个选项。
另一个简单的选择是将匹配存储在变量中(如果找到并从循环中断开)。
var match;
for (var i = 0; i < thingList.length; i++) {
if (thingList[i].id === req.params.somethingId) {
match = thingList[i];
break;
}
}
if(match !== undefined) {
res.send(match);
} else {
res.send("Nothing with that ID found");
}