piped node.js объект ServerResponse создает запись после завершения в грозном событии - PullRequest
0 голосов
/ 09 октября 2018

Базовая HTML-форма с enctype = 'multipart' здесь не включена.Первая поездка на сервер выполняется без ошибок, но после двух поездок по пути загрузки.Узел выдает «Ошибка записи после завершения».Вызов resp.end () внутри события не приводит к этой ошибке, и это происходит только в том случае, если потоковая передача выполняется внутри грозного события.

const http = require( "http" );
const form = require( 'formidable' ).IncomingForm();

    function fileStream( filepath){
        let readstream = fs.createReadStream(filepath );
        readstream.setEncoding( "utf8" );
        return readstream;
    }

    let server = http.createServer();
    server.listen( 8080 );

    server.on( "request", function( req, resp ){

        let requestpath = url.parse( req.url ).pathname.slice( 1 );

    switch ( requestpath ) {
            case "upload":
                form.parse( req );
                form.on( "field", function( field ){
   //throws "ERR_STREAM_WRITE_AFTER_END" after 2nd request/upload trip
                    filestream( "index.html").pipe( resp );
                } )
                break;
            default:
                filestream( "index.html").pipe( resp );
                break;
        }
    } )

Согласно Node.js, поток, переданный IncomingMessage, вызовет end () после закрытия потока чтения.Я пытаюсь понять, в чем причина ошибки.поскольку грозный, похоже, не заканчивается ответ.

1 Ответ

0 голосов
/ 09 октября 2018

Вам нужно создать новый экземпляр IncomingForm для каждого запроса:

const { IncomingForm } = require('formidable');

...

switch (requestpath) {
  case "upload":
    const form = IncomingForm();
    form.parse(req);
    form.on("field", function(field) {

Если вы этого не сделаете, для каждого запроса будет генерироваться дополнительное событие field (я думаю, что formidable внутренне сохраняет данные тела, добавляя в некоторый внутренний буфер).

После того, как первое field событие отправлено, и ваш код передает файл (который впоследствии завершает ответ), второе field событие будетпопытайтесь сделать то же самое, и вы получите ошибку.

...