【发布时间】: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 中)。