管道化的node.js ServerResponse对象在强大事件结束后引发写入操作

时间:2018-10-09 13:34:32

标签: node.js stream formidable

此处未包含enctype ='multipart'的基本html表单。服务器的第一次访问没有错误,但经过上传路径两次后。节点抛出“结束后写入错误”。

在事件内部调用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,在关闭readstream之后,通过管道传递到IncomingMessage的流将调用end()。我试图了解错误的原因是什么。因为强大似乎并没有结束响应。

1 个答案:

答案 0 :(得分:1)

您需要为每个请求创建一个新的IncomingForm实例:

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

...

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

如果不这样做,那么对于每个请求,都会发出一个额外的field事件(我想formidable通过附加到某些内部缓冲区在内部存储主体数据)。

发出第一个field事件,并且您的代码流传输文件(随后结束响应)后,第二个field事件将尝试执行相同操作,并导致发生错误