【问题标题】:Node.js http response end event never firedNode.js http 响应结束事件从未触发
【发布时间】:2019-07-26 21:54:21
【问题描述】:

谁能告诉我为什么它从不触发结束事件?我怎样才能使它可行?

代码:

const http = require('http');
const fs = require('fs');

const file = fs.createWriteStream("mqdefault.jpg");
const request = http.get("http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg", function(response) {
    response.on('data', function(chunk){
        response.pipe(file);
        process.stdout.write('Received data\n');
    })
    response.on('end', function(){
        response.pipe(file);
        process.stdout.write('All data received');
    })
}).on('error', (e) => {
    console.error(`Got error: ${e.message}`);
});

【问题讨论】:

    标签: node.js http fs


    【解决方案1】:

    它确实触发了结束事件

    nt@nt-MS-7885:~/Desktop/node $ node index.js
    Received data
    Received data
    All data received
    

    您没有将所有块添加到文件中 这样你就得到了一个空文件

    使用流尝试这种方法

    const http = require('http');
    const fs = require('fs');
    const Stream = require('stream').Transform;
    
    const fileName = "mqdefault.jpg";
    const request = http.get("http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg", function(response) {
        let data = new Stream()
    
        response.on('data', function(chunk){
            data.push(chunk);
            process.stdout.write('Received data\n');
        })
        response.on('end', function(){
            fs.writeFileSync(fileName, data.read());                               
            process.stdout.write('All data received');
    
        })
    }).on('error', (e) => {
        console.error(`Got error: ${e.message}`);
    });
    

    【讨论】:

      【解决方案2】:

      使用 file.write(chunk) 代替管道。和 file.end 完成写入。

         const http = require('http');
         const fs = require('fs');
      
         const file = fs.createWriteStream("mqdefault.jpg");
         const request = http.get("http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg", function(response) {
             response.on('data', function(chunk){
                 file.write(chunk);
                 process.stdout.write('Received data\n');
             })
             response.on('end', function(){
                 file.end();
                 process.stdout.write('All data received');
             })
         }).on('error', (e) => {
             console.error(`Got error: ${e.message}`);
         });
      

      【讨论】:

        猜你喜欢
        • 2013-05-29
        • 1970-01-01
        • 2016-06-18
        • 2015-01-09
        • 2016-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-05
        相关资源
        最近更新 更多