从findByID返回保存值的MongoDB问题

从findByID返回保存值的MongoDB问题,mongodb,Mongodb,我有一个更新密码的功能问题。我想要的是一个功能,将更新记录的用户数据 export const updateMe = async (req, res, next) => { if (!req) { res.status(400).end() } try { const updatedDoc = await User.findById(req.user._id, function(err, doc) { if (err) return next(er

我有一个更新密码的功能问题。我想要的是一个功能,将更新记录的用户数据

export const updateMe = async (req, res, next) => {
  if (!req) {
    res.status(400).end()
  }

  try {
    const updatedDoc = await User.findById(req.user._id, function(err, doc) {
      if (err) return next(err)

      doc.password = req.body.password

      doc.save()
    })
      .lean()
      .exec()

    res.status(200).json({ data: updatedDoc })
  } catch (e) {
    console.log(e)
    res.status(400).end()
  }
}
我已经编写了中间件,它将在保存密码之前对密码进行散列

userSchema.pre('save', function(next) {
  if (!this.isModified('password')) {
    return next()
  }

  bcrypt.hash(this.password, 8, (err, hash) => {
    if (err) {
      return next(err)
    }

    this.password = hash
    next()
  })
})

我不知道为什么总是接收到错误消息“doc.save()不是函数”

您正在混合承诺和等待代码,而且doc.save()返回一个承诺,所以您需要等待它

(我假设您已经在中间件中设置了req.user.\u id,并且它不是空的。)

因此,如果使用async/await,您的方法必须如下所示:

export const updateMe = async (req, res, next) => {
  if (!req.body.password) {
    return res.status(400).send("Password is required");
  }

  try {
    let updatedDoc = await User.findById(req.user._id);

    updatedDoc.password = req.body.password;

    updatedDoc = await updatedDoc.save();

    res.status(200).json({ data: updatedDoc });
  } catch (e) {
    console.log(e);
    res.status(400);
  }
};