Express - 防止发送两个以上的响应

Ale*_*lls 1 node.js express

使用 Node.js Express 服务器,如果我们尝试向同一请求发送两个响应,我们会收到错误“无法发送标头两次......”。我想找出防止发送两个响应的最佳方法,对于这种特殊情况,但也可能适用于其他情况。

我有一个简单的 /test 路由,它返回有关服务器状态的信息,如下所示:

app.get('/test', function (req, res, next) {

    var client = redis.createClient();

    var response = {};

    var alreadySentResponse = false; //I use a boolean to check if I already sent a response

    client.on("error", function (err) {   //this callback will invoke res.send
        log.error('error in redis client test error callback:', err);
        if(alreadySentResponse === false){
            alreadySentResponse = true;
            res.status(500).send({"test message from SmartConnect": err});
        }

    });

    client.info(function (err, resp) { //this callback will also invoke res.send
        response['redisInfo'] = resp;
        if(alreadySentResponse ===false){
            alreadySentResponse = true;
            res.status(200).send({"test message from SmartConnect": response});
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?res 对象可以跟踪它是否已经发送吗?如果 res.send 被调用两次,服务器似乎会崩溃,等等。当然,另一个问题是,如果客户端存在内部错误,如果发送了成功响应,这并不意味着我不这样做除此之外还想发送 client.on('error') 消息...

lag*_*lex 5

您可以检查res.headersSent

if (res.headersSent) return;
Run Code Online (Sandbox Code Playgroud)
client.info(function (err, resp) { //this callback will also invoke res.send
    if (res.headersSent) return;
    response['redisInfo'] = resp;
    res.status(200).send({"test message from SmartConnect": response});
});
Run Code Online (Sandbox Code Playgroud)