所以我在运行一个节点。js服务器和mongoose,我一直试图使用GridFS节点包下载一个大文件,但我一直收到以下错误:
MongoServerError:find命令::期间执行器错误,原因是::Sort超出了104857600字节的内存限制,但未选择外部排序。
下面是我用来下载文件的代码:
// Stream a single file.
router.get('/stream/:filename', async function(req, res, next){
try{
const file = gfs.find({
filename: req.params.filename
}).toArray((err, files) => {
if (!files || files.length === 0) {
return res.status(404)
.json({
err: "no files exist"
});
}
gfs.openDownloadStreamByName(req.params.filename)
.pipe(res);
});
}catch(err){
return res.status(400).json({
err:'Could not fetch the file.'
})
}
});
鉴于在 StackOverflow 上回答您自己的问题是可以的,我想记录这个问题,以便我的解决方案可以帮助其他人以后遇到它。
事实证明,当您使用GridFS流式下载文件时,组成文件的文档会被排序。根据这篇博文,在进行排序时,MongoDB首先尝试使用索引中指定的顺序检索文档。当没有可用的索引时,它会尝试将文档加载到内存中并在那里进行排序。
问题是Mongo默认配置为在超过32 MB的使用量时中止操作。这就是为什么我们会遇到上面描述的“排序超过内存限制”错误。为了解决这个问题,您必须为“n”字段创建一个索引,其中包含您要下载的文件块的顺序。为此,您可以直接通过数据库界面创建索引(我使用MongoDB Compass GUI),也可以使用createindex()方法通过代码创建它:
// Create an index for the 'n' field to help sort the chunks collection.
db.collection('files.chunks').createIndex({n: 1});
我正在使用以下代码从 GridFS 下载文件。 我得到以下错误: 我试图找到一种方法来为GridFS启用,但找不到。
我已经设置了一个GridFS流来处理zip文件,如果我在浏览器中输入API url,zip文件就会下载到我的计算机上,这正是我想要发生的。然而,当我从前端React应用程序发出get请求时,我得到的是一个数据对象,没有下载效果。我已经可以使用window.location.href下载了,但是我已经在产品中测试过了,它只是把我发送到那个本地主机URL(在产品中不存在)。只是想对此有所了解,我的目标
最近我开始使用node。js。当我在我的一个项目中完成一个需求时,我面临一个问题,我应该能够将一些数据动态写入csv文件,并让它作为弹出窗口提示用户下载(如我们通常看到的,带有保存和取消选项)。在谷歌搜索了一段时间后,我决定使用csv npm模块https://github.com/wdavidw/node-csv-parser.我能够将数据写入文件并使用此模块进行保存。我想提示一个弹出窗口来保存
我有一个使用Twitter API开发的Nodejs应用程序。当托管在Heroku上时,它会出现以下错误: 2018-12-14T10:00:03.678180 00:00 heroku[web.1]:错误 R10(启动超时)- 在搜索时,我遇到了这些StackOverflow问题q1 q2,但它们都使用ExpressJS并监听固定端口,而不是Heroku提供的端口,而我的应用程序没有使用Expr
我只是一个初学者node.js我会尝试用xpress制作一个站点,这样我就可以在那里上传任何东西。我在我的mac上本地设置服务器。 这是我写的代码 server.js 这些是错误信息 节点上载。js公司 /Users/dayatura/Documents/node/node\u modules/express/lib/application。js:209抛出新的TypeError('app.use
我在同一个文件夹(tut67)中创建了这个javascript文件,index.html,about.html,contact.html,services.html,但它仍然给出了每个html文件的错误。(我使用MacBook Air)。 代码如下::: 常量about=fs.readfileSync('./about.html'); const contact=fs.readfileSync('