使用 mongoose、gridfs-stream 和 multer 上传文件时出现 MongoError

2023-11-30

我正在使用 Express 4 运行multer, gridfs 流 and mongoose使用 mongodb,我正在尝试上传文件并将其流式传输到 gridfs。

执行此操作的快速路线定义为:

app.post('/uploadfile', function (req, res) {
    console.dir(req.files);

    // The mongodb instance created when the mongoose.connection is opened
    var db = mongoose.connection.db;

    // The native mongo driver which is used by mongoose
    var mongoDriver = mongoose.mongo;

    // Create a gridfs-stream
    var gfs = new Gridfs(db, mongoDriver);

    var file = req.files.myFile;

    var fileId = new ObjectId();

    console.log("Creating WriteStream");
    var writeStream = gfs.createWriteStream({
        _id: fileId,
        filename: file.originalname,
        mode: 'w',
        content_type: file.mimetype,
        metadata: {
            id: '123',
            number: '2',
            name: "Kenny Erasmuson"
        }
     });
     console.log("Created WriteStream");
     req.pipe(writeStream);
     console.log("Finished!");
});

Express 应用程序运行后,将选择并上传一个文件(通过 HTML multipart/form-data 表单),节点服务器的输出为:

$ node server.js 
Listening on port 8001
{ myFile: 
    { fieldname: 'myFile',
    originalname: 'kenny-credit-rating.pdf',
    name: '1082e5071ede1002c4ae5be6123226d8.pdf',
    encoding: '7bit',
    mimetype: 'application/pdf',
    path: 'uploads/1082e5071ede1002c4ae5be6123226d8.pdf',
    extension: 'pdf',
    size: 110782,
    truncated: false,
    buffer: null } 
}
Creating WriteStream
Created WriteStream
Finished!
/Users/kenny/Dropbox/Dev/fileUploader/node_modules/mongoose/node_modules/mongodb/lib/mongodb/co nnection/base.js:246
    throw message;      
          ^
MongoError: The dollar ($) prefixed field '$conditionalHandlers' in '_id.$conditionalHandlers' is not valid for storage.
at Object.toError (/Users/kenny/Dropbox/Dev/fileUploader/node_modules/mongoose/node_modules/mongodb/lib/mongodb/utils.js:114:11)
at /Users/kenny/Dropbox/Dev/fileUploader/node_modules/mongoose/node_modules/mongodb/lib/mongodb/collection/core.js:569:27
at /Users/kenny/Dropbox/Dev/fileUploader/node_modules/mongoose/node_modules/mongodb/lib/mongodb/db.js:1157:7
at /Users/kenny/Dropbox/Dev/fileUploader/node_modules/mongoose/node_modules/mongodb/lib/mongodb/db.js:1890:9
at Server.Base._callHandler (/Users/kenny/Dropbox/Dev/fileUploader/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/base.js:448:41)
at /Users/kenny/Dropbox/Dev/fileUploader/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/server.js:481:18
at MongoReply.parseBody (/Users/kenny/Dropbox/Dev/fileUploader/node_modules/mongoose/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js:68:5)
at null.<anonymous> (/Users/kenny/Dropbox/Dev/fileUploader/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/server.js:439:20)
at emit (events.js:95:17)
at null.<anonymous> (/Users/kenny/Dropbox/Dev/fileUploader/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection_pool.js:201:13)

有谁知道导致错误的原因以及如何修复?


问题在于您不只是将文件请求传送到 gridfs-stream。使用 Multer 作为中间件并捕获任何multipart/form-data发布请求。当数据流进入时,Multer(基于Busboy) 监视on('field') and on('file')事件并进行相应的解析。您通过管道传送给 Multer 的不仅仅是一个文件。

这段代码工作正常,因为 Multer 确实已经为你解析出来了req.files and req.body至此:

   // Create a gridfs-stream
   var gfs = new Gridfs(db, mongoDriver);

   var file = req.files.myFile;

   var fileId = new ObjectId();

   console.log("Creating WriteStream");
   var writeStream = gfs.createWriteStream({
        _id: fileId,
        filename: file.originalname,
        mode: 'w',
        content_type: file.mimetype,
        metadata: {
            id: '123',
            number: '2',
            name: "Kenny Erasmuson"
        }
     });
     console.log("Created WriteStream");

但是由于上述原因,您的代码遇到问题的地方在这里:

 req.pipe(writeStream);

我还没有找到一种方法来传输多部分/表单数据发布请求,而不仅仅是直接将文件上传到 GridFS。如果您的 post 请求不包含文件以外的任何内容(意味着表单中没有其他 html 输入字段),那么您可能需要考虑至少针对此路由从中间件中删除 Multer。

对于我的用例,我需要能够接收带有文本输入的 html 表单帖子以及文件上传(我存储有关上传文件的元数据)。以下是我如何使用 Multer 完成我所需要的工作:

var uploadImg = function(req,res) {
      var writestream = gfs.createWriteStream({
        filename: req.files.file.name,
        mode:'w',
        content_type:req.files.file.mimetype,
        metadata:req.body,
      });
    fs.createReadStream(req.files.file.path).pipe(writestream);

    writestream.on('close', function (file) {
        res.send("Success!");
        fs.unlink(req.files.file.path, function (err) {
          if (err) console.error("Error: " + err);
          console.log('successfully deleted : '+ req.files.file.path );
        });
    });

};

默认情况下,Multer 会将您的文件存储在磁盘上。一种快速解决方案是创建一个读取流并将其直接流回 GridFS。写入完成后,删除tmp文件。

附带说明一下,似乎有人认为最好仅在需要它的路由上使用 Multer 作为中间件。您可以在最后一节中阅读有关该想法的更多信息this.

Update

我想我即将找到一种直接流式传输到 GridFS 的方法with元数据通过使用Skipper。我正在查看是否无法获取某些更新船长 gridfs这将获取 html 表单上的文本输入并将其设置为元数据等。对船长-gridfs 的调整似乎很小。当它被冲掉时我会更新。如果您查看船长,请确保您认识到 html 表单输入的顺序(如果有的话)确实很重要。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 mongoose、gridfs-stream 和 multer 上传文件时出现 MongoError 的相关文章

  • 使用 AWS CDK 为 lambda 指定自定义角色

    我意识到它很新 但我没有看到任何语言的任何示例 说明如何为使用 AWS CDK 创建的 lambda 指定角色 我正在尝试这样做 const cdk require aws cdk cdk const lambda require aws
  • Mongoose 独特的验证不起作用。保存重复条目

    我正在开发一个 NodeJS 应用程序 其中express是框架 MongoDB是数据库 我正在使用猫鼬插件 我有一个父母模型 我已经添加了独特 真实到场 mobile 但是每当我添加相同的手机号码时 唯一性验证就会失败 除了保存重复的文档
  • 如何处理 MongoDB 的断开连接错误

    我在 Node js 进程中看到了这个未捕获的异常 Uncaught exception Error read ETIMEDOUT at TCP onStreamRead internal stream base commons js 16
  • 如何将函数设置为 multer 上的限制参数?

    在这个问题之后 我可以使用 multer 和单个 html 表单上传不同文件夹中的多个文件吗 https stackoverflow com questions 39726862 cani upload many files in diff
  • 无法在适当的时间对域调用 dispose

    我有一个问题domain模块 目前 我正在尝试捕获请求中引发的任何未捕获的错误 使用express中间件和域 所有请求在调用之前都会通过此函数路由next并继续走正确的路线 app use req res next gt domain cr
  • 从 Nodejs 提供二进制/缓冲区/base64 数据

    我在从节点提供二进制数据时遇到问题 我开发了一个名为的节点模块节点说话它执行 TTS 文本到语音 并返回 Base64 编码的音频文件 到目前为止 我这样做是为了转换base64到缓冲区 二进制文件 然后提供它 var src Base64
  • nvm 与 npm 配置“前缀”选项不兼容:

    我正在尝试运行另一个 NodeJS 版本nvm但出现此错误 nvm use v4 2 4 nvm is not compatible with the npm config prefix option currently set to Us
  • MongoDB:检查值是否为空或数组是否为空

    我想匹配所有不包含 公司 属性或 公司 值为空或空数组的文档 User find Company in null function err users if err throw err console log users length th
  • socket.io 的良好初学者教程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 从数据库检查数据的异步解决方案各种循环子句

    我想要做的是异步检查数据库并从中获取结果 在我的应用程序中我试图实现Asynchronously将此步骤解决为 从数据库中检查手机号码JsonArray循环子句的种类 Create JsonArray从结果 打印创建的数组 我学到了足够多的
  • 在 Mac OS Sierra 上使用 brew 安装节点失败

    我正在尝试在 macOS Sierra 上使用自制程序安装节点 我跑 brew install node 看似成功安装后 我在尝试运行时得到以下信息node dyld Library not loaded usr local opt icu
  • pine、node.js (express) 和 Access-Control-Allow-Origin

    我正在本地电脑上开发一个应用程序 前端应该使用 spinjs 构建 后端 api 使用 node js 构建 Spine 运行在端口 9294 上 node js 运行在端口 3000 上 在 Spine 中 我在模型中添加了以下内容 ur
  • 在 Azure 上运行节点应用程序时出错

    我们正在尝试在azure上运行节点应用程序 它已成功部署 但当我们尝试运行该应用程序时 我们在跟踪日志中收到以下错误 ActivityId A5FF0B34 7C3F 4A99 9497 6C04A9AE9A9F 消息 在进程终止之前 ii
  • nodejs knox 放入 s3 结果是 403

    我尝试在 nodejs 项目中使用 knox 上传到 Amazon s3 存储桶 但无法解决 403 错误 我已确保密钥 秘密和存储桶已正确设置 我真的需要那些有更多经验的人的帮助 我的节点代码如下 var upload test func
  • 动态数据 Express.JS 的缓存控制

    如何建立一个缓存控制政策在快递 js关于 JSON 响应 我的 JSON 响应根本没有改变 所以我想积极缓存它 我找到了如何对静态文件进行缓存 但找不到如何对动态数据进行缓存 不优雅的方法是简单地添加一个调用res set 在任何 JSON
  • Node.Js - 获取 Windows 用户名

    我正在尝试获取运行我的node jS应用程序的计算机的Windows用户名 该应用程序始终在Windows计算机上运行 如何使用 Node Js 获取当前的 Windows 用户名 我想找到类似的东西WindowsIdentity GetC
  • 等待两个异步函数完成,然后在 Node.js 中继续

    我正在 Node js 中开发一个应用程序 其中调用异步函数两次 并将值分配给全局变量 问题是我想使用这两个调用的结果来做其他事情 但是这个其他事情不会等待结果被分配 这是我的代码 var a var b let x abcd foo x
  • 在 Nestjs 的我的模块中导入另一个模块的存储库

    我正在尝试使用 Nestjs 构建一个应用程序 目前我有两个模块 用户和身份验证 其结构如下 我需要注射用户服务 into 认证服务为了与User实体 所以首先我注入了用户存储库 into 用户服务并导出服务 用户 模块 ts import
  • 接近堆限制的无效标记压缩分配失败 - JavaScript 堆内存不足

    我正在使用 Angular 7 2 当我进入ng serve 我面临以下问题 致命错误 接近堆限制的无效标记压缩分配失败 JavaScript 堆内存不足 这意味着什么 我该如何解决这个问题 完整的错误消息是 FATAL ERROR Ine
  • 如何在 Express (NodeJS) 中验证和处理表单

    Express 是否有首选的表单处理和验证库 我真的在寻找与 Django 表单中类似的抽象级别 即模板中的验证和错误报告 如果可以在客户端使用相同的验证 那就太好了 有人用过或者写过什么好东西吗 看起来有一个模块位于https githu

随机推荐

  • 混合模式 C++/CLI 性能注意事项 - 最佳实践

    我有一个 C CLI 库 它调用许多本机 C 方法 我读过许多线程 指出不应混合托管和非托管代码 我找不到任何说明如何避免这些开关以及为什么它会导致性能问题的信息 有人可以分享最佳实践吗 使用 C CLI 的唯一原因是它支持混合托管代码和本
  • 如何每次迭代增加一个字母 N 次并存储在数组中?

    letter array for i A i ZZ i letter i print r letter 从上面的脚本我做了一个循环A B C D ZZ 现在 我想把它变成A C E G I ZZ 2步骤而不是1 我需要指导才能做到这一点 这
  • 在 Firebase 中加入两个节点

    我正在开发一个应用程序 它应该显示来自两个节点 Firebase 的数据 Firebase DB 的结构如下 College 4F2EAB65 id 4F2EAB65 name SomeCollege A3C2ED31 id A3C2ED3
  • pandas:将DataFrame最后一行除以第一行

    这个问题类似于Python Pandas 按第一行划分 DataFrame 我有一个数据框 如下所示 1125400 5430095 1095751 2013 04 02 98 91 NaN 5626 79 2013 04 03 99 29
  • 从 Java 执行 EXE 并从 EXE 获取输入和输出

    我有一个EXE file addOne exe它不断地从控制台上的用户输入一个整数 不是命令行参数 并输出整数 1到控制台上 示例输出如下所示 1 2 6 7 29 30 我正在尝试编写一个java程序 它可以 Run the EXE 不断
  • Swift 2 错误处理问题

    我正在使用 REST 获取 JSON 数据 然后解析它 为此 我使用 NSJSONObjectWithData 据我所知 该方法过去在其参数内有一个错误处理程序 但它不再存在 在我的代码中 let err NSError let optio
  • 自定义 Spring Security 应用程序中的无限循环

    我们尝试用现有的 Spring Security Basic Login 替换开源应用程序中的 REST API 以实现使用令牌的自定义登录 我读过这篇关于该主题的博文 http javattitude com 2014 06 07 spr
  • 将 HTML 实体转换为正确的字符 R

    有谁知道 r 中可以转换的通用函数 228 为其 unicode 字符 我见过一些函数 并将其转换为普通字符 任何帮助 将不胜感激 谢谢 编辑 下面是一条数据记录 我可能有超过100万条记录 除了将数据读入大量向量并针对每个元素更改记录之外
  • 由元组索引的 Python `dict`:获取饼图的一部分

    假设我有 my dict airport London Heathrow airport Tokyo Narita hipsters London Soho 什么是一种有效的 无需扫描所有键 而又优雅的方式来让所有机场脱离这本字典 即预期输
  • 避免 Android 中 EditText 的解析错误

    对于 stackoverflow 社区 我创建了这个方法来将一些 EditText 字段转换为双精度 我添加 if 语句专门是为了避免解析错误 因为我知道我的几个 EditText 字段将留空 然而 它们仍然在运行时不断出现 有人知道避免解
  • Scala 不可变变量和打印

    目前正在学习一个使用 Scala 的课程 我以前从未使用过它 因此语法和本身都是新的 我正在研究一个简单的除法函数 但遇到了一些错误 首先 我使用 var sub m 对吗 在我的代码中 我只是想做 m m n 但你无法更改变量 而且我不确
  • 使用 SAXParser 从 XML 检索 HTML 编码文本

    这是我第一次使用 SAXParser 我在 Android 中使用它 但我认为这对这个特定问题没有影响 并且我正在尝试从 RSS 提要中读取数据 到目前为止 它在很大程度上对我来说工作得很好 但是当它到达包含 HTML 编码文本的标签时 例
  • 如何在django中存储用户数组?

    我有一个 django 模型 它基本上是一个名为Contexts 它包含一些字段 例如name description和一个用户 下面是定义的模型 class Contexts models Model context name model
  • 如何比较三个预训练模型的余弦相似度?

    我有两个语料库 一个包含所有女性领导人的演讲 另一个包含男性领导人的演讲 我想测试这样一个假设 一个语料库中两个单词之间的余弦相似度与另一个语料库中相同两个单词之间的余弦相似度显着不同 这样的 t 检验 或等效的 合乎逻辑并且可能吗 此外
  • 在 Azure Function 中运行 .exe 可执行文件

    我有可执行文件 abcd exe 它包含 与许多 dll 合并 是否可以为 abcd exe 创建 Azure Function 并在 Azure Cloud Functions 中运行它 abcd exe 应用程序 System Diag
  • 使用 SQLite 开发 AIR 应用程序的最佳实践

    我将开始做几个 Adob e AIR 项目 这些项目将使用SQLite提供的功能AIR 由于这是我第一次尝试这样做 我希望得到一些指导 技巧和开发最佳实践 由于此应用程序将访问本地数据库 因此我想我可以在应用程序启动时打开与数据库的连接 并
  • 如何将数组添加到ArrayList中?

    我有一个 int 3 3 数组 它只包含 0 或 1 个值 如果值为1 我想将ArrayList中该值的坐标添加为int 2 数组 但我不知道为什么它总是添加最后一个1值坐标 有什么问题 public static void main St
  • Laravel 5.1 Eloquent isFillable() 单元测试中的差异

    在单元测试中使用时 Eloquent 会忽略模型的可填充设置吗 在非测试情况下 我得到以下输出 这是正确的 因为模型只允许某些可填充字段 m new Model dd m gt isFillable nonexistent field gt
  • 为什么在访问 Ruby on Rails 应用程序中的用户页面时不断收到路由错误?

    我正在尝试向以下位置的微帖子添加评论https github com railstutorial sample app 2nd ed来自迈克尔 哈特尔 Railstutorial 看来如果用户没有发微博 就没有问题 我可以访问他们的页面 但
  • 使用 mongoose、gridfs-stream 和 multer 上传文件时出现 MongoError

    我正在使用 Express 4 运行multer gridfs 流 and mongoose使用 mongodb 我正在尝试上传文件并将其流式传输到 gridfs 执行此操作的快速路线定义为 app post uploadfile func