【问题标题】:MongoDB, BSONTypeError: Argument passed in must be a string of 12 bytes or a string of 24 hex characters or an integerMongoDB,BSONTypeError:传入的参数必须是12字节的字符串或24个十六进制字符的字符串或整数
【发布时间】:2022-09-24 09:15:33
【问题描述】:

我正在做我的项目没有错误,但突然服务器端崩溃,错误是\“BSONTypeError:传入的参数必须是12个字节的字符串或24个十六进制字符或整数的字符串\”

我已经尝试过 StackOverflow 针对类似问题的其他建议,但它不起作用。

我附加了- const ObjectId = require(\'mongodb\').ObjectId;

但还没有解决。代码的完整错误是

var _this = _super.call(this, message) || this;
                           ^

BSONTypeError: Argument passed in must be a string of 12 bytes or a string of 24 hex characters or an integer
    at new BSONTypeError (F:\\Web Development\\Projects\\Fiverr\\hridayshaha\\server\\node_modules\\bson\\lib\\error.js:41:28)
    at new ObjectId (F:\\Web Development\\Projects\\Fiverr\\hridayshaha\\server\\node_modules\\bson\\lib\\objectid.js:66:23)
    at ObjectId (F:\\Web Development\\Projects\\Fiverr\\hridayshaha\\server\\node_modules\\bson\\lib\\objectid.js:26:20)
    at F:\\Web Development\\Projects\\Fiverr\\hridayshaha\\server\\index.js:107:24
    at Layer.handle [as handle_request] (F:\\Web Development\\Projects\\Fiverr\\hridayshaha\\server\\node_modules\\express\\lib\\router\\layer.js:95:5)
    at next (F:\\Web Development\\Projects\\Fiverr\\hridayshaha\\server\\node_modules\\express\\lib\\router\\route.js:144:13)
    at Route.dispatch (F:\\Web Development\\Projects\\Fiverr\\hridayshaha\\server\\node_modules\\express\\lib\\router\\route.js:114:3)
    at Layer.handle [as handle_request] (F:\\Web Development\\Projects\\Fiverr\\hridayshaha\\server\\node_modules\\express\\lib\\router\\layer.js:95:5)
    at F:\\Web Development\\Projects\\Fiverr\\hridayshaha\\server\\node_modules\\express\\lib\\router\\index.js:284:15
    at param (F:\\Web Development\\Projects\\Fiverr\\hridayshaha\\server\\node_modules\\express\\lib\\router\\index.js:365:14)
[nodemon] app crashed - waiting for file changes before starting...

index.js:107:24 --- console.log(id);

从第 105 行

        app.get(\'/events/:id\', async(req, res) =>{
        const id = req.params.id;
        console.log(id);
        const query = {_id: ObjectId(id)};
        const items = await eventsCollection.findOne(query);
        res.json(items);
  • 那么server/index.js 的第 107 行会发生什么?
  • 第 105 行:app.get(\'/events/:id\', async(req, res) =>{ 第 106 行:const id = req.params.id; 第 107 行:console.log(id); const 查询= {_id: ObjectId(id)}; const items = await eventsCollection.findOne(query); res.json(items); })--- 我不知道发生了什么,一切都很好,但是当我想要的时候获取它崩溃的数据。
  • 请将该代码添加到您的问题中,而不是在评论中发布。
  • 好的,我正在编辑。

标签: javascript node.js bson


【解决方案1】:

您的代码中没有输入验证,但您不能假设 req.params.id 始终是有效的 ObjectId

您可以修改路由路径以确保路由处理程序只接受看起来像有效ObjectId 的内容:

app.get('/events/:id([0-9a-fA-F]{24})', async (req, res) => { … });

记录在here

【讨论】:

  • 谢谢它正在工作,但我在过去的项目中做了同样的过程,从未使用过 'id([0-9a-fA-F]{24})' 但即使在这个项目中也能正常工作,但它突然崩溃了的原因。?
  • @Hosen 很可能有人/某事在没有有效身份证件的情况下请求/events/XXX。也许是为了“测试”你的服务器,也许是出于错误,谁知道:D
【解决方案2】:

我有一个类似的问题,只要确保查询数据库时是具体的。 而不是 findByIdAndUpdate 使用 findOneAndUpdate,如果您打算使用 findByIdAndUpdate,请确保您确实使用了 id 而没有别的。 id 的全部问题在于您正在查询 id,但您很可能使用电子邮件来执行实际查询。

【讨论】:

    猜你喜欢
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多