【问题标题】:Argument passed in must be a string of 12 bytes传入的参数必须是 12 字节的字符串
【发布时间】:2022-01-14 12:19:19
【问题描述】:

大家好,我在尝试删除数据库中的条目时收到此消息。 我在 req.body 上尝试过 JSON.parse,在我的路由文件中切换了路由,但似乎没有任何效果。

这是我的控制器:

async function removeToy(req, res) {
  try {
    const { toyId } = req.params
    const removedId = await toyService.remove(toyId)
    res.send(removedId)
  } catch (err) {
    logger.error('Failed to remove toy', err)
    res.status(500).send({ err: 'Failed to remove toy' })
  }
}

这是服务:

async function remove(toyId) {

  try {
      const collection = await dbService.getCollection('toy')
      await collection.deleteOne({ '_id': ObjectId(toyId)})
      return toyId
  } catch (err) {
      logger.error(`cannot remove toy ${toyId}`, err)
      throw err
  }
}

还添加了 DB 外观的图片:

以及整个错误的图片:

感谢任何形式的帮助!

【问题讨论】:

    标签: javascript node.js mongodb express


    【解决方案1】:

    在您的数据库中,您有一个_id 类型为string 的对象。

    在您的查询中,您正在(可能)将string 转换为ObjectID,这是一个对象。不仅您传递给 ObjectId() 的参数不是它支持的东西(如错误所示,请参见下文),即使它有效,查询也会导致 0 次点击:毕竟"TZ23c" !== ObjectId("TZ23c")

    只需将.deleteOne({_id: ObjectId(toyId)}) 更改为.deleteOne({_id: toyId})

    ObjectId() 要么不带参数(它将返回一个新值),要么只需要 12 个字节(24 个十六进制字符),例如:ObjectId("61e16f21f82a9db6a2094e78")

    ObjectId 的字符串表示形式 (ObjectId().toString()) 不是任意字符串:它是一个时间戳、一些标识哪个服务器生成它的值以及一些用于防止冲突的随机值。并非每个字符串都是有效的 ObjectId。

    【讨论】:

      【解决方案2】:

      由于消息表明您传递给函数的 toyId 长度错误,它必须是 12 个字节长,例如:

        mongos> ObjectId("x448c")
        2022-01-14T13:43:51.427+0100 E QUERY    [js] Error: invalid object id: length 
        :
        @(shell):1:1
        mongos>
      

      正确的是:

        mongos> ObjectId("61e16facafe3aa6023c221bb")
        ObjectId("61e16facafe3aa6023c221bb")
      

      【讨论】:

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