使用Fs模块在NodeJs中上传文档:错误:结束后写入

时间:2015-04-24 11:22:31

标签: javascript node.js fs

我一直在尝试使用以下代码上传文档。

我做了Google搜索,但还没有找到任何解决方案。

app.post('/documents', function (req, res) {

    var document = {};

    var fstream = null;

    // populate fields
    form.on("field", function (name, value) {
        document[name] = value ;

    });

    form.on("part", function (part) {

        if (!part.filename) {
            return;
        }

        var path = __dirname + '/files/' + part.filename;

         fstream = app.npm.fs.createWriteStream(path);

        document.type = part.headers["content-type"]
        document.name = part.filename;
        document.size = part.byteCount;
        document.path = path;

        fstream.on("close", function () {
            db.sequelize.models.Document.create(document).then(function (newDocument) {
                    res.send(newDocument)
                    res.end();
                },
                function (error) {
                    res.send(error);
                });
        });
        part.pipe(fstream);

    });

    form.on("close", function (data) {

        fstream.end();
        fstream = null;

    });

    form.parse(req);
});

注意:我使用的是fs模块。 https://nodejs.org/api/fs.html

第一张图片工作正常。但是当我尝试上传另一张图片时,会引发异常:

events.js:72         扔掉//未处理的错误'事件               ^

  

错误:写完后       在writeAfterEnd(_stream_writable.js:132:12)       在Form.Writable.write(_stream_writable.js:180:5)       在写(_stream_readable.js:601:24)       在流程(_stream_readable.js:610:7)       在IncomingMessage.pipeOnReadable(_stream_readable.js:642:5)       在IncomingMessage.emit(events.js:92:17)       在emitReadable_(_stream_readable.js:426:10)       在emitReadable(_stream_readable.js:422:5)       在readableAddChunk(_stream_readable.js:165:9)       在IncomingMessage.Readable.push(_stream_readable.js:127:10)

1 个答案:

答案 0 :(得分:5)

找到了解决方案。

var form = new app.npm.multiparty.Form();

这是在全球范围内定义的。 对于每个新请求,我应该创建一个新的表单实例,因为在前一个调用中流是关闭的,所以我应该通过获取最新内容来创建一个新实例。

解决方案看起来像:

app.post(' / documents',function(req,res){

var document = {};

var form = new app.npm.multiparty.Form();

var fstream = null;

...

其余的都一样。