Конечное событие http ответа Node.js никогда не запускалось - PullRequest
0 голосов
/ 05 марта 2019

Может кто-нибудь сказать мне, почему он никогда не запускает конечное событие? Как я могу сделать это работоспособным?

Код:

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

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Используйте 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}`);
   });
0 голосов
/ 05 марта 2019

это завершает событие завершения

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