首页 > 解决方案 > 使用 Mongoose 处理承诺的问题

问题描述

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

我目前正在处理 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
        });
    });

此代码运行不正常。

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

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

有什么想法吗?

标签: javascriptmongooseerror-handlingpromise

解决方案


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

尝试改变:

.then(() => {

至:

.then(newMovie => {

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


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

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

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


推荐阅读