我有一个快速应用程序,当我在本地运行时它可以工作.问题是下载使用GridFS在mongoDB中保存的文件.在本地运行时(我只需要./bin/www并转到localhost:3000),我可以下载该文件.但是当我远程运行
这是处理响应的路由:
router.get('/getfile',function(req,res) { if (req.isAuthenticated()) { var gfs = Grid(mongoose.connection, mongoose.mongo); var id = req.query.id; gfs.exist({_id: id}, function (err, found) { if (err) return handleError(err); if (!found) res.send('Error on the database looking for the file.') }); var readStream = gfs.createReadStream({ _id: id }).pipe(res); } else res.redirect('/login'); });
这是由玉石文件中的这一行调用的:
td #[a(href="getfile?id=#{log.videoId}" download="video") #[span(name='video').glyphicon.glyphicon-download]]
在服务器上,我正在做:
/logApp$export NODE_ENV=production /logApp$./bin/www
mongoDB deamon正在运行.实际上,我可以查询数据库.而且我不写任何文件!我想读它.
编辑:我发现错误消息:
MongoError: file with id #### not opened for writing您需要将管道文件的代码移动到gfs.exist回调中的响应中,以便在存在检查之后运行它.
gfs.exist({ _id: id }, function(err, found) { if (err) { handleError(err); return; } if (!found) { res.send('Error on the database looking for the file.') return; } // We only get here if the file actually exists, so pipe it to the response gfs.createReadStream({ _id: id }).pipe(res); });
显然,如果文件不存在,您会得到通用的“未打开写入”错误.