Javascript 处理承诺和异步等待函数
我在node和express中有这个函数Javascript 处理承诺和异步等待函数,javascript,node.js,express,async-await,es6-promise,Javascript,Node.js,Express,Async Await,Es6 Promise,我在node和express中有这个函数 router.post('/', async (req, res) => { const playlist = new Playlist({ song: req.body.song, artist: req.body.artist }) try { const newPlaylist = await playlist.save() res.status(201
router.post('/', async (req, res) => {
const playlist = new Playlist({
song: req.body.song,
artist: req.body.artist
})
try {
const newPlaylist = await playlist.save()
res.status(201).json(newPlaylist)
} catch (err) {
res.status(400).json({ message: err.message })
}
})
然而,我得到了这个错误
(node:23242) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'song' of undefined
我建议你也用try/catch来包装第一部分。如果
req.body
无法填充,或者newplaylist
抛出任何类型的错误,因为这是一个异步函数,这将成为一个被拒绝的承诺。这样更安全:
router.post('/', async (req, res) => {
try {
const playlist = new Playlist({
song: req.body.song,
artist: req.body.artist
})
const newPlaylist = await playlist.save()
res.status(201).json(newPlaylist)
} catch (err) {
res.status(400).json({ message: err.message })
}
})
如果您遇到“无法读取未定义的属性'song'的错误”,这意味着无法解析请求正文,并且仍然是未定义的。可能是发送了错误的
内容类型
标题,或者您没有正确设置正文解析中间件。您已使用try。。。接球,这很好。
尽管超出此范围,try catch也可能是一个问题。
所以这里可能有两个错误
req.body.song
或req.body.artist
或Playlist
不是有效的类res.status(400).json({message:err.message})
这可能是另一个问题unhandledPromisejectionWarning
发生,因为您没有捕获异常。我想您必须向我们显示playlist.save()
和playlist()的代码
constructor,因为您所展示的代码中没有任何明显的东西会导致该错误。如果没有更多的代码,很难知道这一点,但是新的Playlist()是一个秘密承诺,或者Playlist.save()正在做一些古怪的事情。我建议添加控制台日志,看看这两件事中哪一件真的失败了。save是一个mongoose方法@jfriend00Yeah,但是在.save()
过程中,你的某个地方没有一些模型代码吗?因为此处显示的代码本身不会导致未处理的PromisejectionWarning
。所以,肯定还有别的原因。也可能是newplaylist()
正在抛出,并报告为未处理PromisejectionWarning
,因为它位于异步
函数中。该错误不会提供任何详细信息,例如错误消息和错误所在的行号?谢谢,我不再收到该错误,这很好。但是,当我使用Postman发出post请求时,我得到以下错误{“message”:“无法读取未定义的”}的属性'song'。所以,也许我没有正确设置主体解析,这应该处理JSON吗?如果是,邮递员是否正在发送内容类型:application/json
?express是否配置为解析JSON?如果您还没有设置body解析中间件,请参阅我在某个地方读到的,express现在附带body解析器,因此我没有单独安装body解析器。我现在就试试。