【问题标题】:'end' event from readstream is emitted twice来自 readstream 的“结束”事件被发出两次
【发布时间】:2014-02-21 09:25:20
【问题描述】:

我正在尝试将文件上传到 nodejs 中的 mongodb 的 gridfs。这是我的一段代码:

var fs = require('fs');
var gridfs = require('gridfs-stream');
var mongo = require('mongodb');
var gfs;

mongo.Db.connect('mongodb://...', function (err, db) {
    console.log('*** connect to upload files');
    gfs = gridfs(db, mongo);

    var fpath = req.files.image_file.path;
    var fname = id + '_' + req.files.image_file.name;
    console.log('*** final name = ' + fname);

    var writestream = gfs.createWriteStream({ filename: fname });
    var readstream = fs.createReadStream(fpath);

    readstream.on('open', function () {
        console.log('*** stream opened');
        readstream.pipe(writestream);
    });
    readstream.on('end', function () {
        console.log('*** file upload finished');
        doCSUpdate();
    });
    readstream.on('error', function() {
        console.log('*** error occured');
        doCSUpdate();
    });
});

doCSUpdate() 是其他函数。

问题是在日志中我看到file upload finished 出现了两次,而stream opened 只出现了一次

13:21:30 web.1  | *** connect to upload files
13:21:30 web.1  | *** final name = ...
13:21:30 web.1  | *** stream opened
13:21:30 web.1  | *** file upload finished
13:21:30 web.1  | *** file upload finished

这会导致 doCSUpdate() 运行两次,这有时会导致 Can't set headers after they are sent 错误,因为响应设置了两次..

【问题讨论】:

  • 我正在使用类似的代码,尽管我正在关注可写流上的close 事件,而不是可读流的end 流。不过,我不知道为什么end 会被触发两次。
  • @robertklep,它工作正常吗?据我从文档nodejs.org/api/stream.html#stream_event_close 了解到,并非每个流都会发出close 事件。但它没有描述哪些流可以,哪些不可以......
  • 是的,对我来说很好用(类似情况:将通过 Express 上传的文件存储在 GridFS 中)。

标签: node.js gridfs


【解决方案1】:

我知道这已经晚了,但认为它可能对未来的搜索者有用。

也许 [文件上传完成] 消息出现了两次,因为上传是分块完成的,就像您将任何大小合适的文件上传到 GridFS 时一样。快速解决方法是使用保护子句来防止函数再次运行。

我之前遇到过这个问题,当 readstream 的 'data' 事件多次发出导致 Node 抱怨 [错误:发送后无法设置标头]。像下面这样简单的东西可能会有所帮助。

var doCSUpdateAlreadyCalled = false;
...
if (! doCSUpdateAlreadyCalled){
   doCSUpdateAlreadyCalled = true;
   doCSUpdate();
}

【讨论】:

    猜你喜欢
    • 2015-01-09
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    相关资源
    最近更新 更多