Javascript 处理承诺和异步等待函数

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

我在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).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
    不是有效的类
  • 在catch块上
    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解析器。我现在就试试。