当我有一个处理请求的简单函数时,我可以使用res.end()
和return
在任何时候结束它(发生一些错误/不正确的数据等)
get('/', function (req, res) {
if (!req.param('id')) {
res.send('Must provide ID!');
res.end(); // <-- response is ready, send it to client
return; // <-- request processing stops here, get() finishes
}
// do other stuff
res.send('ok'); // <-- this can never overlap with the previous res.send()
});
但是,如果其他功能中嵌入了功能,return
将仅退出最后一个功能
get('/', function (req, res) {
validate(req);
// do other stuff
res.send('ok'); // <-- this can cause errors? res was ended already
});
function validate(req, res) {
if (!req.param('id')) {
res.send('Must provide ID!');
res.end(); // <-- send response to client
return; // <-- this one exists only from validate()
}
}
我相信应该调用向客户端res.end()
发送响应,但是如何阻止进一步处理代码 - 即从所有函数返回?
答案 0 :(得分:2)
无法从被调用的函数返回,只需使用如下的回调:
function validate(req, res, callback) {
if (!req.param('id')) {
res.send('Must provide ID!');
res.end();
} else {
callback();
}
}
get('/', function (req, res) {
validate(req, function () {
res.send('ok');
});
});
答案 1 :(得分:1)
您可以在验证功能中返回true
或false
,具体取决于您是否已发送回复。
但是,它不是节点风格。在节点中首选使用回调。
答案 2 :(得分:1)
我知道这是一个老问题但可能对其他人有所帮助。您可以像这样使用res.headersSent
get('/', function (req, res) {
validate(req);
// will only be sent if validate hasn't already sent the error message
if(!res.headersSent) {
res.send('ok');
}
});
function validate(req, res) {
if (!req.param('id')) {
res.send('Must provide ID!');
res.end();
}
}