【问题标题】:How to close a http.ServerResponse prematurely?如何过早关闭 http.ServerResponse?
【发布时间】:2015-06-25 07:02:33
【问题描述】:

假设当我正在从我用 Node.js 编写的 http 服务器发送分块响应时发生错误。此时无法向客户端发送错误消息,我认为this answer 在这种情况下的操作是正确的:

您所能做的就是关闭连接。客户端要么没有收到所有的标头,要么在响应结束时没有收到终止的 0 长度块。无论哪种方式都足以让客户端知道服务器在发送过程中遇到错误。

所以问题是,如何在我的 http.ServerResponse 对象上执行此操作?我不能打电话给end,因为那样客户会认为一切顺利,没有close 方法。有一个'close' 事件,但我觉得这是我应该在这种情况下倾听的东西,而不是自我释放,对吧?

【问题讨论】:

    标签: node.js http


    【解决方案1】:

    我按以下方式进行:

    function respDestroy()
    {
        this._socket.destroy();
    }
    
    function respReply(message, close)
    {
        if (!close)
            this.end(message);
        else
            this.end(message, function(){ this.destroy(); });
    }
    
    server.on('request', 
        function(req, resp)
        {
            resp._socket = resp.socket; // `socket` field is nulled after each `end()`
            resp.destroy = respDestroy;
            resp.reply = respReply;
            ...
        });
    

    您也可以修改respReply 以接受状态码和状态消息。

    【讨论】:

    • 好的,所以 resp 有一个套接字字段?对不起,如果我是盲人和/或愚蠢的,但是文档中的哪个地方说明了这一点?
    • @njlarsson 是的,它从某个版本开始就有,但在文档中还没有提到(你可以自己检查console.log(resp.socket)。根据你的Node版本,你可以使用它或req的字段- 它们是相同的。请注意,不能使用字段socket,因为在调用回调之前它已为空。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    相关资源
    最近更新 更多