gpt4 book ai didi

javascript - 在 node js/javascript 中使用 OR 条件时,传入的参数必须是 Buffer 或 12 个字节的字符串或 24 个十六进制字符的字符串

转载 作者:行者123 更新时间:2023-12-04 17:10:15 25 4
gpt4 key购买 nike

我想通过 _id 从数据库中获取数据和 ownerId所以我给了 OR条件,但收到此错误

Argument passed in must be a Buffer or string of 12 bytes or a string of 24 hex characters
我的代码如下
var ObjectId = require("mongodb").ObjectId;


const getDetailById = async (req, res) => {
const { id } = req.params;
try {
let detail = await Task.find(
{ $or: [{ ownerId: id }, { _id: ObjectId(id) }] }
).populate("shop");
} catch (err) {
sendError(401, "Cannot get detail by given id", err.message, req, res);
}
};
在这里我可以通过传递 _id 从数据库中获取数据这是 24 个字符,但是当我尝试通过 ownerId 获取数据时它向我展示了这个错误:
Argument passed in must be a Buffer or string of 12 bytes or a string of 24 hex characters
我的输出看起来像这样
 {
"_id": "61483aa5e6dcd5bb6b2c9c58",
"ownerId": "b0jytaonktsc5ghf",
"ownerName": "check demo",
"ownerDescription": "Testing purpose",
"shop": {
"_id": "61483aa5e6dcd5bb6b2c9c55",
"shopName": "Aakash",
"shopPlace": "Mumbai",
"__v": 0
},

"createdAt": "2021-09-20T07:39:17.528Z",
"updatedAt": "2021-09-20T07:39:17.528Z",
"__v": 0
},
这是我的架构:
const mongoose = require("mongoose");
const uniqid = require("uniqid");

const ownerSchema = new mongoose.Schema(
{
ownerId: {
type: String,
default: uniqid(),
unique: true,
},
OwnerName: {
type: String,
},
taskTag: [
{
type: String,
},
],
onwerDescription: {
type: String,
},
shop: {
type: mongoose.Schema.Types.ObjectId,
ref: "peoples",
default: null,
},
},
{ timestamps: true }
);

const owner = mongoose.model("task", ownerSchema);

module.exports = owner;

最佳答案

问题

  • ObjectId正好有 24 个十六进制字符或 12 个字节的字符串
  • uniqid用于生成 ownerId 的库生成 18 字节唯一 ID

  • 原因
    如您所见,这两种格式不兼容。所以发生的事情是这样的:
  • 您尝试根据 uniqid() 的值查询数据库生成
  • $or的第二个参数将尝试生成 ObjectId基于该值,并且由于格式与 ObjectId 不兼容格式,会抛出 ObjectId 格式无效的错误

  • 解决方案
    您可以更改 uniqid带有 native Node 的库 crypto库生成 12 个字节的 24 个十六进制字符串,这将与 ObjectId 兼容格式。由于是原生包,所以不需要安装,直接导入即可使用。现在您还可以删除 uniqid从您的项目中打包并减少依赖项的数量。
    const mongoose = require("mongoose");
    const crypto = require("crypto");

    const ownerSchema = new mongoose.Schema(
    {
    ownerId: {
    type: String,
    default: crypto.randomBytes(12).toString('hex'),
    unique: true
    },
    ...
    );

    关于javascript - 在 node js/javascript 中使用 OR 条件时,传入的参数必须是 Buffer 或 12 个字节的字符串或 24 个十六进制字符的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69612379/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com