【问题标题】:Mongoose .save Method Works But Promise returns errorMongoose .save 方法有效但 Promise 返回错误
【发布时间】:2020-09-13 13:42:05
【问题描述】:

我在 MongoDB 中有一个集合,我可以在 Express 中使用 get 来检索数据。但是当从客户端发出更新请求时它可以工作,但是 mongooseInstance.save().then((err, settings) ... 承诺将有效负载作为错误变量返回。

代码如下:

const SettingsSchema = mongoose.Schema({
  _id: mongoose.Schema.Types.ObjectId,
  main_email: String,
  bio: String,
  gitHub_url: String,
  linkedin_url: String,
  bio_intro: String,
  bio_tagline: String,
  bio_pic: String
}),

SettingsModel = mongoose.model('profile_settings', SettingsSchema, 'profile_settings');

app.get('/profileSettings', (req, res) => {
  SettingsModel.find((err, settings) => {
    if (err) {
      res.status(500).send(err);
    } else {
      res.json(settings);
    }
  });
});

app.put('/profileSettings', (req, res) => {
  SettingsModel.findById("5ec40c318f3ebfe68a400e6f", (err, settings) => {
    if (err) {
      res.status(500).send(err);
    }
    if (settings) {
      settings.main_email = req.body.main_email;
      settings.bio_intro = req.body.bio_intro;
      settings.bio_tagline = req.body.bio_tagline;
      settings.bio_pic = req.body.bio_pic;
      settings.bio = req.body.bio;
      settings.linkedin_url = req.body.linkedin_url;
      settings.gitHub_url = req.body.gitHub_url;

      settings.save().then((err, settings) => {
        console.log('err: ', err);
        console.log('settings: ', settings);
        if (err) {
          res.status(500).send(err);
          //res.json(err);
        } else {
          res.json(settings);
        }
      }); 
    } else {
      res.status(404).send('Settings Failed to Update');
    }
  });
});

所以 get 按预期工作,而 put 实际上更新了 mongo db 中的所有值。但是在保存方法中,错误和设置都是相同的。 当此代码运行时,它会向客户端发送 500 错误,即使后端一切正常。

      console.log('err: ', err);
      console.log('settings: ', settings);
      if (err) {
        res.status(500).send(err);
        //res.json(err);
      } else {
        res.json(settings);
      }
    });

如果我将res.json(err) 放在if(err){} 中,那么它返回的结果与res.json(settings) 相同,并且我得到一个 200 状态,但这并不能让我正确处理错误。

提前致谢。这是我正在使用的版本

节点:10.15.1

快递:4.16.1

猫鼬:5.9.14

mongoDB Atlas 服务

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    .then 的语法有误。您需要更新它,如下所示

    settings.save().then(settings => {
     console.log('settings: ', settings);
     res.json(settings);
    }, err => {
     console.log('err: ', err);
     res.status(500).send(err);
    }); 
    

    【讨论】:

    • 谢谢你的工作,所以我猜承诺不会将错误作为第一个参数返回?我最终使用了你的方法,但使用了一个 catch 代替。
    • settings.save() .then(settings => { console.log('settings: ', settings); res.json(settings); }) .catch( err => { console. log('err: ', err); res.status(500).send(err); });
    • 我也尝试破坏模型,它没有保存在 mongo 中,但也没有抛出错误。我想知道 save 方法抛出错误需要什么。我收到了 200 回给客户,但我的数据没有保存。
    • 是的,您也可以catch 阻止,您可以查看此内容以选择最适合您的用例的方法stackoverflow.com/questions/33278280/promise-then-vs-then-catch
    • 我完全不明白打破模型。但是假设您需要检查承诺拒绝场景,一个简单的选项是在模型中添加一个临时字段以用于测试目的并将其标记为required:true 并在没有该字段的情况下保存。您将收到验证错误
    猜你喜欢
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 2012-10-26
    • 2016-07-14
    • 2021-06-06
    • 2018-06-04
    相关资源
    最近更新 更多