使用 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 功能来使用 then
和 catch
。请注意,我实际上并没有更改这些功能中的任何内容。
在这种情况下,电影也成功添加到数据库中,但客户端的状态为 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 模型检索并作为承诺处理的文档时遇到问题