【发布时间】: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