我正在使用强大的内容来上传文件。当上传失败时(例如,当uploadDir不可写时),form.on('error')不处理错误,而是一个未捕获的异常。如何处理上传错误?这基本上是来自fromidable的自述文件的示例代码,其中包含一个不存在的uploadDir和一个错误处理程序。
var formidable = require('formidable'),
http = require('http'),
util = require('util');
http.createServer(function(req, res) {
if (req.url == '/upload' && req.method.toLowerCase() == 'post') {
// parse a file upload
var form = new formidable.IncomingForm();
form.uploadDir = '/foo/'; // this does not exist
form.on('error', function(error) { // I thought this would handle the upload error
console.log("ERROR " + error);
return;
})
form.parse(req, function(err, fields, files) {
res.writeHead(200, {'content-type': 'text/plain'});
res.write('received upload:\n\n');
res.end(util.inspect({fields: fields, files: files}));
});
return;
}
// show a file upload form
res.writeHead(200, {'content-type': 'text/html'});
res.end(
'<form action="/upload" enctype="multipart/form-data" method="post">'+
'<input type="text" name="title"><br>'+
'<input type="file" name="upload" multiple="multiple"><br>'+
'<input type="submit" value="Upload">'+
'</form>'
);
}).listen(8000);
我收到的错误是:
events.js:66
throw arguments[1]; // Unhandled 'error' event
^
Error: ENOENT, open '/foo/9b4121c196dcf3f55be4c8465f949d5b'
答案 0 :(得分:0)
根据我在Formidable's lib/file.js
中看到的内容,它尝试将文件作为fs.WriteStream
打开,但从不在该流上附加error
事件处理程序。当WriteStream
无法打开文件时,它会发出error
事件,该事件不会在Formidable中处理并引发错误。我说这是Formidable中的一个错误,因为该文件中定义的File
包装器本身就是EventEmitter
,并且可以拦截流上的错误并将它们作为自己的错误事件重新发出上游处理。