Chained Promise with Express:在最后一步中未收到任何数据

Chained Promises With Express: No data received in final step

本文关键字:任何 数据 最后一步 with Promise Express Chained      更新时间:2023-09-26

我正在使用Mongoose的findOneAndUpdate方法来处理我的restful API的放置请求。我将密码留到第二步以使用 Mongoose 的"保存"预钩,并且我在预钩子中对密码进行哈希处理。

router.put("/:id", function(req, res, next){
  var password = req.body["password"];
  delete req.body["password"];
  var p = new Promise(function (resolve, reject){
    User.findOneAndUpdate({_id:req.params.id}, req.body, { 'new': true } ,function (err, user) {
      if (err) {
        reject(err);
      }
      else {
        resolve(user);
      }
    });
  });
  p.then(function(user){
    if(!password) {
      return user;
    }
    user.password = password;
    user.save(function(err) {
      if (err) {
        return(err);
      }
      else {
        console.log(user); // The object is updated and here, but in postman I have "No Data Received"
        return(user);
      }
    });
  }).then(function(result){
    return res.json(result);
  }).catch(function(err){
    next(err);
  });
});

在上面的评论中,我在该块中有用户对象。但是在邮递员中,我有"未收到数据"。有什么想法吗?

更好的是,使用mongoose预保存钩子。

UserSchema.pre('save', true, function beforeSave (next, done) {
  let user = this;
  if (this.isModified('password')) {
    bcrypt.genSalt(10, function genSalt (err, salt) {
      if (err) {
        return done(err);
      }
      bcrypt.hash(user.password, salt, function hash (err, hash) {
        if (err) {
          return done(err);
        }
        user.password = hash;
        done();
      });
    });
  } else {
    done();
  }
  next();
});

这将允许您保存用户,如果密码未被修改,则不会更新它。

router.put('/:id', function (req, res, next) {
  User.findById(req.params.id).exec(function (err, user) {
    user.set(req.body);
    user.save(function (err) {
      if (err) {
        return next(err);
      }
      return res.json(user);
  });
});