使用 Mongoose 处理承诺的问题

Posted

技术标签:

【中文标题】使用 Mongoose 处理承诺的问题【英文标题】:Problem with promise handling using 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 方法吗? 【参考方案1】:

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

尝试改变:

.then(() => 

到:

.then(newMovie => 

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


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

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

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

【讨论】:

那行得通,我想我没有注意到我的新方法。顺便说一句,你能解释一下这种方法之间的实际区别吗?

以上是关于使用 Mongoose 处理承诺的问题的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬承诺与蓝鸟和打字稿

使用 Mongoose 处理承诺的问题

在更新使用 Mongoose 模型检索并作为承诺处理的文档时遇到问题

测试时出现“mpromise(猫鼬的默认承诺库)已弃用”错误[重复]

mongoose基本增删改查

Mongoose.create + Q 将 mongoose 承诺转换为 Q 承诺