【问题标题】:Node.js: Difference between http finish event, response close event, and response end eventNode.js:http完成事件、响应关闭事件和响应结束事件之间的区别
【发布时间】:2022-01-11 03:33:11
【问题描述】:

我是 NodeJS 的新手,在查看文档并尝试使用 http.on('finish')res.on('close')res.on('end') 之后,我不明白它们有何不同。

http.get(url, res => {

        res.setEncoding('utf8'); // returns string object to data event
        res.on('data', string => {
            const responseObj = responseDataList.find(responseObj => {
                return responseObj.url === url;
            });
            responseObj.data += string;
        });
        res.on('close', () => {
            console.log('[Interruption] connection closed before response was ended.');  // Never fires
        })

        res.on('error', console.error);

        // TODO: find out difference between response.end and response.close and http.finish events
        res.on('end', (data, encoding) => {
            // Seems to fire at the same time that http.on('finish') fires
            current++;
    
            if (counter === current) {
                responseDataList.forEach(responseObj => {
                    console.log(responseObj.data);
                })
            }
        });
    })
    .on('error', console.error)
    .on('finish', () => {
        // Seems to fire at the same time that res.on('end') fires
        console.log('response sent')
    }); // emitted when the response is sent to the OS (not when it is received by the client)

每一种何时开火,它们有何不同?

【问题讨论】:

    标签: javascript node.js http events


    【解决方案1】:

    只要http.get 使用res 对象调用您的回调,它就会返回一个http.ClientRequesthttp.ClientRequest 继承自 Stream

    所以,根据docs

    finish 事件在调用stream.end() 方法后触发,并且所有数据都已刷新到底层系统。

    http.get 的情况下,stream.end() 在发出请求后立即被调用(参见here)。注:调用stream.end() 不同于监听res.on('end') 事件。

    所以对于http.getfinish 事件将在发出请求后立即触发,然后res 对象事件将开始触发。

    您的res 对象是一个HTTP.IncomingMessage,它实现了Readable Stream 接口

    根据Readable Stream 文档:

    当流中没有更多数据要消耗时,会发出“结束”事件。

    所以end 先触发然后close

    也适用于Readable Streams

    当流及其任何底层资源(例如文件描述符)已关闭时,将发出“关闭”事件。该事件表明不会再发出任何事件,也不会发生进一步的计算。

    所以事件按以下顺序触发:finishendclose

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      • 2015-04-04
      相关资源
      最近更新 更多