【问题标题】:Mongoose - 5.3.4 - Prevent cast to ObjectId for query with stringMongoose - 5.3.4 - 防止强制转换为 ObjectId 以使用字符串进行查询
【发布时间】:2019-04-27 16:05:09
【问题描述】:

我正在尝试在用户模型上 findOneAndUpdatea 基于字符串的令牌。和 我收到错误:

Cast to ObjectId failed for value "{ passwordResetToken: '4946d72f19b9649d3f306a0f5be59005c884ae453fc049c7',
  passwordResetExpires: { '$gt': 1543196590882 } }" at path "_id" for model "User"

文档是这样存储的:

{
    "_id": {
        "$oid": "5bfb424da0cc0923f05b67f1"
    },
    "local": {
        "email": "XXXXXXXXXXXXXXXXX",
        "password": "XXXXXXXXXXXXXXXXX"
    },
    "isVerified": false,
    "method": "local",
    "__v": 0,
    "passwordResetExpires": {
        "$date": "2018-11-26T02:41:17.851Z"
    },
    "passwordResetToken": "4946d72f19b9649d3f306a0f5be59005c884ae453fc049c7"
}

然后我像这样查询文档:

req.params.token = "4946d72f19b9649d3f306a0f5be59005c884ae453fc049c7"


User.findByIdAndUpdate({
      'passwordResetToken': req.params.token,
      'passwordResetExpires': { $gt: Date.now() }
    }, 
    {
      'local.password'        : req.body.password,
      'passwordResetExpires'  : null,
      'passwordResetToken'    : null
    }, {new: true})
    .then(user => {
      res.send(user);
    })
    .catch(err => next(err))

这是我当前的架构

var userSchema = mongoose.Schema({
  method: {
    type: String,
    enum: ['local', 'google', 'facebook']
  },
  local: {
    email: {
      type: String,
      lowercase: true
    },
    password: String,
  },
  google: {
    id: String,
    email: {
      type: String,
      lowercase: true
    },
    name: String,
    token: String
  },
  facebook: {
    id: String,
    name: String,
    token: String
  },
  isVerified: {
    type: Boolean,
    default: false,
    required: true
  },
  passwordResetToken: String,
  passwordResetExpires: Date
});

我猜猫鼬正在尝试将这个十六进制字符串转换为 _id 值?有什么方法可以防止猫鼬将字符串转换为ObjectId Type

【问题讨论】:

  • 那是findOneAndUpdate()findByIdAndUpdate() 特别是{ _id: idValue } 的简写形式。您不能将其用于任何其他形式。即使您文档中的_id 不是ObjectId(这里不是这种情况),那么您还是使用其他方法。
  • @NeilLunn 当然......漫长的一天。干杯

标签: node.js mongodb express mongoose


【解决方案1】:

在 mongoose 中,如果您使用 findByIdAndUpdate(),您必须提供一个值,即 objectID。因此,在您的情况下,它会尝试查找对象 ID 但无法找到,因此您会收到错误消息。更适合您的用例的是findOneAndUpdate()。在这里,您可以随意使用其他参数。

【讨论】:

    猜你喜欢
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多