Аргумент "listener" должен иметь тип Function. Что-то не так с узлом.JS 9.3.0 1 на MacOS



Вот мой код, который я получил из официальных документов с некоторыми моими модификациями:



let file = fs.createWriteStream( "data/test.txt" );

let httpOptions = "https://google.com";
const req = https.request( httpOptions, ( response ) => {

response.on( 'data', ( chunk ) => {

response.pipe( file );

file.on( "finish", () => {} )
.on( "close", () => { file.close(); } )
.on( "error", ( err ) => { console.log( "!!! Error: " + err ); } );

} );

});

req.on( 'error', (e) => {
console.error(e);
});

req.end();


Я получаю: "аргумент" listener "должен иметь тип Function" в этой строке:



.on( "close", () => { file.close(); } )


Что я делаю не так? Я добавил обработчик" закрыть", так что он должен работать нормально, но это не так.



Вот полная Ошибка:





events.js:180
throw new errors.TypeError('ERR_INVALID_ARG_TYPE', 'listener', 'Function');
^

TypeError [ERR_INVALID_ARG_TYPE]: The "listener" argument must be of type Function
at _addListener (events.js:180:11)
at WriteStream.addListener (events.js:240:10)
at WriteStream.close (fs.js:2298:10)
at WriteStream.file.on (/Users/.../myscript.js:229:32) <=== This is .on( "close", () => { file.close(); } )
at WriteStream.emit (events.js:159:13)
at fs.close (fs.js:2141:14)
at FSReqWrap.oncomplete (fs.js:149:20)



Узел.js: 9.3.0_1, MacOS X: 10.12.5



UPD:
Если я изменю эти строки на новые:



file.on( "finish", () => { } )
.on( "close", () => { } )


Нет никаких ошибок, кроме выходного файла быть пустой. Итак, узел.js не позволяет мне закрыть файл должным образом:)

743   1  

1 ответ:

Я не могу повторить ошибку. Если я возьму код из вашего вопроса, добавлю два вызова require и выполню его, я не получу ошибку (на *nix, а не на Mac OS, но они очень похожи). Но я также не получаю данных в файле.

Вызов pipe в пределах событие data не имеет большого смысла. Вместо этого:

const fs = require("fs");
const https = require("https");

let file = fs.createWriteStream( "data/test.txt" );
// *** Note moving the code setting up these handlers out of the `data` callback
// That said, since you're using `pipe`, I don't think you need the close handler,
// and your finish handler doesn't do anything
file.on( "finish", () => {} )
    .on( "close", () => { file.close(); } )
    .on( "error", ( err ) => { console.log( "!!! Error: " + err ); } );

let httpOptions = "https://google.com";
const req = https.request( httpOptions, ( response ) => {
    // *** Do the pipe
    response.pipe( file );
});

req.on( 'error', (e) => {
    console.error(e);
});

req.end();
Если я сделаю это, я получу данные (в частности, текст 302) в файле. (Я также получаю его, и никаких ошибок, не добавляя никаких обработчиков в file.)

Comments

    Ничего не найдено.