【发布时间】:2019-10-30 21:06:34
【问题描述】:
我想从我的 MongoDB 数据库下载一个文件。我发现使用 GridFS 存储桶的 openDownloadStream 可以在您将其通过管道传输到 Node 的 fs createWriteStream 时工作,然后在“完成”时将该数据发送到客户端以使用 res 下载进行下载。我的问题是,在几次尝试下载文件后,我的超时安全缓冲失败,客户端无法及时找到文件,然后浏览器给出空响应错误。但是,几秒钟后,文件最终会下载。
我正在将 mongoDB 集成到已经具有下载功能的现有服务器中。以前,文件存储在项目的文件系统中,现在它们在 MongoDB 中。我试过管道到不同的地方,但没有运气。
// Router's Download Logic
router.get("/download", function(req, res) {
setTimeout(download, 2000);
function download() {
var bucket = new mongodb.GridFSBucket(localDatabase())
bucket.openDownloadStreamByName(file)
.pipe(fs.createWriteStream(file))
.on('error', function(error) {
assert.ifError(error)
})
.on('finish', function() {
console.log(`Downloaded ${file}`)
res.download(file)
fs.access(file, function(err) {
if (err) {
console.log(err)
}
else {
fs.unlinkSync(file)
}
})
})
}
});
我希望在 2 秒窗口后下载文件,让函数有足够的时间运行。在大约 3 次尝试下载后,我得到的是一个空响应错误。我最终得到了该文件,但似乎我在一个服务器实例中下载的越多,下载所需的时间就越长 -> 管道 -> createWriteStream。
编辑:问题来自取消链接。我更改了路径以转到 TEMP 文件夹,但我不想永远将这些文件存储在那里。我也不想在与下载它们相同的算法中取消它们的链接,因为这就是导致问题的原因。对此的任何建议都会有所帮助。
【问题讨论】:
标签: node.js mongodb download gridfs