piped node.js ServerResponse对象在事件结束后抛出write

piped node.js ServerResponse对象在事件结束后抛出write,node.js,stream,formidable,Node.js,Stream,Formidable,此处不包括enctype='multipart'的基本html表单。到服务器的第一次访问没有错误,但在通过上载路径进行两次访问之后。节点抛出“结束后写入错误”在事件内部调用resp.end()不会产生此错误,并且仅当流管道在事件内部完成时才会发生此错误 const http = require( "http" ); const form = require( 'formidable' ).IncomingForm(); function fileStream( filepath){

此处不包括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()。我正在努力了解错误的原因是什么。因为强大似乎不会结束响应。

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

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

...

switch (requestpath) {
  case "upload":
    const form = IncomingForm();
    form.parse(req);
    form.on("field", function(field) {
如果不这样做,对于每个请求,将发出一个额外的
字段
事件(我猜
通过附加到某个内部缓冲区来在内部存储正文数据)


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

强大有权访问响应对象吗?@NdifrekeEkim没有,但我编辑了我的答案以解释发生了什么:D