【问题标题】:Problem with promise handling using Mongoose使用 Mongoose 处理承诺的问题
【发布时间】:2020-12-15 06:33:03
【问题描述】:

我正在做我自己的项目。他的主要想法是电影评论。

我目前正在处理 HTTP 请求,试图让我的代码更好一些。 我想我的承诺处理有问题:

    try {
        let newMovie = await MovieRepository.addNewMovie({
            name: req.body.name,
            year: req.body.year,
            description: req.body.description,
            length: req.body.length,
            genres: req.body.genres,
            totalRating: req.body.totalRating
        });
        return res.status(200).json({ name: newMovie, message: 'Movie added successfully!' });
    } catch (error) {
        return res.status(400).json({ status: 400, message: errorMessage.addNewMovie });
    }

此代码有效!我正在添加一部新电影,并且按预期获得了 OK 状态。

快速解释我的代码:我正在使用MovieRepository,我使用猫鼬功能添加新电影。从正文中获取我需要的所有信息并将其发送给客户端。

现在,我尝试稍微更改一下我的代码:

let newMovie = await MovieRepository.addNewMovie({
        name: req.body.name,
        year: req.body.year,
        description: req.body.description,
        length: req.body.length,
        genres: req.body.genres,
        totalRating: req.body.totalRating
    }).then(() => {
        return res.status(200).json({
            name: newMovie,
            message: 'Movie added successfully!'
        });
    }).catch((error) => {
        return res.status(400).json({
            status: 400,
            message: errorMessage.addNewMovie,
            systemError: error
        });
    });

此代码运行不正常。

在这里,我使用 Promise 功能来使用 thencatch。请注意,我实际上并没有更改这些功能中的任何内容。

在这种情况下,电影也成功添加到数据库中,但客户端的状态为 400。

有什么想法吗?

【问题讨论】:

  • 你能复制/粘贴你的 addNewMovie 方法吗?

标签: javascript mongoose error-handling promise


【解决方案1】:

我的理解可能有点偏离和不正确(JS 新手),但我认为 newMovie 在您的 then 调用中未定义。

尝试改变:

.then(() => {

到:

.then(newMovie => {

另外,我认为您在两种方法(有承诺和没有承诺)中的 return 语句没有做同样的事情——这可能会对您的其余代码产生影响。


这是我对这两种方法之间差异的有限理解:

  • 第一种方法将addNewMovie 的返回值分配给变量newMovie,外部异步函数返回res.status(...).json(...) 返回的任何值。
  • 第二种方法将承诺链的返回值res.status(...).json(...) 分配给newMovie——然后外部异步函数隐式/自动返回undefined(如果没有显示其他return 语句)。李>
  • 如果您将catch 移动到then 上方,我认为这会让您看到您的addNewMovie 正在成功完成(即电影正在添加到数据库中),但是您的成功处理程序 then 抛出错误。

我相信其他人可以给你一个更好、更正式和准确的解释。

【讨论】:

  • 那行得通,我想我没有注意到我的新方法。顺便说一句,你能解释一下这种方法之间的实际区别吗?
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 2021-10-07
  • 2018-10-13
  • 2018-07-02
  • 2016-05-16
  • 2020-04-03
  • 2020-11-30
  • 1970-01-01
相关资源
最近更新 更多