【问题标题】:Uploading document in NodeJs using Fs module : Error: write after end使用 Fs 模块在 NodeJs 中上传文档:错误:结束后写入
【发布时间】:2015-07-02 23:33:43
【问题描述】:

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

我用谷歌搜索过,目前还没有找到任何解决方案。

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)

【问题讨论】:

  • 请不要这样使用eval() (read here why not)。
  • @robertklep 完全同意!我将对此进行进一步重构....但是我找不到任何其他方法来使用表单数据设置多部分流。
  • document[name] = value?
  • @robertklep 我觉得很丢脸。谢谢!

标签: javascript node.js fs


【解决方案1】:

找到了解决办法。

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;

...

其余的都是一样的。

【讨论】:

  • 是的,我犯了同样的错误。更清楚地查看documentation,它清楚地表明multiparty.Form 在每次调用传递给http.createServer(每个请求)的回调时都会被实例化。我也看了看,最后搜索“多方错误:结束后写”,这让我想到了你的问题。
猜你喜欢
  • 2016-04-27
  • 2016-11-05
  • 1970-01-01
  • 2020-03-20
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
相关资源
最近更新 更多