📜  转换为 ObjectId 的值失败 - Javascript (1)

📅  最后修改于: 2023-12-03 15:12:15.948000             🧑  作者: Mango

以'转换为 ObjectId 的值失败 - Javascript

在使用 MongoDB 进行开发时,经常需要使用 ObjectId 类型来标识文档的唯一标识符。在前端开发中,通常会使用 JSON.parse 方法将序列化的 JSON 字符串转换成 JavaScript 对象,其中包含了一个 ObjectId 类型的属性。由于 ObjectId 类型不是 JavaScript 原生的类型,因此在进行转换时可能会发生错误。

如果在将一个包含 ObjectId 类型的属性的 JSON 字符串转换为 JavaScript 对象时发生了错误,通常会看到一个类似于以下的错误信息:

Uncaught (in Promise) Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters
    at new ObjectID (ObjectID.js:45)
    at Function.createFromHexString (ObjectID.js:157)
    at Function.createFromId (ObjectID.js:147)
    at Object.<anonymous> (index.js:4)

这个错误提示表示,传入 ObjectId 构造函数的值必须是一个长度为 12 的字节串或者是一个由 24 个十六进制字符组成的字符串。如果传入的值不符合要求,就会抛出上述错误。

为了解决这个问题,我们可以在将 JSON 字符串转换为 JavaScript 对象之前,使用正则表达式或其他方法,对其中的 ObjectId 类型属性进行特殊处理,将其转换为符合要求的字符串,然后再进行转换。

以下是一个示例代码片段,用于将 JSON 对象中的 ObjectId 类型属性转换为字符串:

const fixObjectIds = (obj) => {
  for (const [key, value] of Object.entries(obj)) {
    if (typeof value === 'object') {
      if (value instanceof ObjectId) {
        obj[key] = value.toHexString()
      } else {
        fixObjectIds(value)
      }
    }
  }
}

const fixJson = (json) => {
  const obj = JSON.parse(json)
  fixObjectIds(obj)
  return obj
}

在上述代码中,fixJson 方法接受一个 JSON 字符串作为参数,并返回一个已经处理过的 JavaScript 对象。其中,fixObjectIds 方法用于遍历对象的属性,将其中的 ObjectId 类型属性转换为字符串。如果对象的属性是一个嵌套的对象,则递归调用 fixObjectIds 方法。最后,fixJson 方法调用了 JSON.parse 方法将 JSON 字符串转换为 JavaScript 对象,并在返回前调用了 fixObjectIds 方法,将其中的 ObjectId 类型属性转换为字符串。