简体   繁体   中英

Node.js http response end event never fired

Can anyone please tell me why it never fires the end event? How can I make it workable?

Code:

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}`);
});

it does firing end event

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

you didn't add all the chunks to the file that's way you get an empty file

try this approach using stream

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}`);
});

Use file.write(chunk) instead of pipe. and file.end to finish writing.

   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}`);
   });

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM