Mongoose - 5.3.4 - Запрет приведения к ObjectId для запроса со строкой - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь findOneAndUpdate токен на основе строки в модели пользователя.И я получаю ошибку:

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
});

Я думаю, mongoose пытается преобразовать эту шестнадцатеричную строку в значение _id?Есть ли какой-нибудь способ помешать мангусте бросить нить в ObjectId Type?

1 Ответ

0 голосов
/ 26 ноября 2018

В mongoose, если вы используете findByIdAndUpdate(), вы должны указать значение, которое является objectID.Итак, в вашем случае он пытается найти идентификатор объекта, но не может, и, следовательно, вы получаете ошибку.Что-то более подходящее для вашего варианта использования будет findOneAndUpdate().Здесь вы можете использовать другие параметры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...