此处未包含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()。我试图了解错误的原因是什么。因为强大似乎并没有结束响应。
答案 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
事件将尝试执行相同操作,并导致发生错误