我正在使用Node.js实现文件上传,我的代码在正常情况下工作正常。
但是,当我无法编写文件(例如,将其写入不存在的目录)时,它会调用错误处理程序fstream.on('error', ...)
,但它会卡住并且永远不会继续。
我假设通过删除传入流,busboy
继续进行下一部分处理,但看起来情况并非如此。
我想运行相同的busboy.on('end')
来响应浏览器(带有一些错误信息),但是如何才能调用它?
var express = require("express");
var Busboy = require('busboy');
var fs = require('fs');
var upload = require('./upload');
var Path = require('path');
var app = express();
app.get("/", function(request, response) {
response.writeHead(200, { Connection: 'close'});
response.end('<html><body>' +
'<form action="/upload" method="post" enctype="multipart/form-data">' +
' <input type="file" name="filefield">' +
' <input type="submit">' +
'</body></html>');
});
app.post("/upload", function(request, response) {
// request.files will contain the uploaded file(s),
// keyed by the input name (in this case, "file")
console.log(request.body);
var fileId = upload.generateId();
var busboy = new Busboy({headers: request.headers});
busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
var path = Path.join('images', fileId);
console.log('hello');
var fstream = fs.createWriteStream(path);
fstream.on('end', function() {
console.log("EOF");
});
fstream.on('close', function() {
console.log("CLOSE");
});
fstream.on('error', function(err) {
console.log("ERROR:" + err);
file.unpipe();
fstream.end();
});
fstream.on('finish', function() {
console.log('onFinish');
})
file.on('end', function() {
console.log('file end');
});
file.pipe(fstream);
});
busboy.on('end', function() {
console.log('busboy end');
response.json({id:fileId});
});
request.pipe(busboy);
});
app.listen(3000);
答案 0 :(得分:4)
我通过将file.read()
放在'error'
事件处理程序中来解决了这个问题。
fstream.on('error', function(err) {
console.log("ERROR:" + err);
file.read();
});
当createWriteStream
出错时,调用error
处理程序并解析管道连接(unpiped
),但传入流(file
)中有未读数据流,并没有消耗。
通过调用.read()
,它被读取(但没有传递给可写流,因为没有人正在监听)并且end
事件被发送给读者。这会触发busboy.on('end')
。