在express.js中完成处理请求

时间:2014-02-25 15:08:44

标签: node.js express

当我有一个处理请求的简单函数时,我可以使用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()发送响应,但是如何阻止进一步处理代码 - 即从所有函数返回?

3 个答案:

答案 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)

您可以在验证功能中返回truefalse,具体取决于您是否已发送回复。

但是,它不是节点风格。在节点中首选使用回调。

答案 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();
    }
}