在生产中使用GridFS在节点中下载文件

时间:2016-02-04 14:39:50

标签: node.js mongodb express

我有一个快速应用程序,当我在本地运行时可以使用它。问题是下载使用GridFS在mongoDB中保存的文件。在本地运行时(我只需要./bin/www并转到localhost:3000),我可以下载该文件。但是当我远程运行时,我下载了一个html文件。

这是处理响应的路线:

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

1 个答案:

答案 0 :(得分:1)

您需要将管道文件的代码移动到响应中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);
});

如果文件不存在,显然你会得到通用的“未打开写入”错误。