【问题标题】:Handling promise and async await function处理 promise 和 async await 函数
【发布时间】:2020-09-22 20:13:02
【问题描述】:

我在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

【问题讨论】:

  • 我认为您必须向我们展示 playlist.save()Playlist() 构造函数的代码,因为您展示的代码中没有任何明显的地方会导致该错误。
  • 如果不看更多代码很难知道,但是 new Playlist() 是底层的 Promise,或者 playlist.save() 正在做一些时髦的事情。我建议添加控制台日志并查看这两件事中的哪一件实际上失败了
  • .save 是一个猫鼬方法@jfriend00
  • 是的,但是在.save() 过程中,您的某处不存在一些模型代码吗?因为您在此处显示的代码本身不会导致UnhandledPromiseRejectionWarning。因此,必须有 ELSE 做出贡献。 new Playlist() 也有可能正在抛出,并且被报告为 UnhandledPromiseRejectionWarning,因为它在 async 函数中。
  • 这个错误没有给你更多的细节,比如错误信息和错误所在的行号?

标签: javascript node.js express async-await es6-promise


【解决方案1】:

我建议您也将第一部分包装在 try/catch 中。如果req.body 没有被填充,或者new Playlist 抛出任何类型的错误,因为这是一个异步函数,这将成为一个被拒绝的承诺。这样更安全:

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 })
    }
})

如果您收到“无法读取未定义的属性‘歌曲’”错误,这意味着无法解析请求正文并保持为undefined。可能发送了错误的content-type 标头,或者您没有正确设置正文解析中间件。

【讨论】:

  • 谢谢我不再收​​到错误,这很棒。但是,当我使用 Postman 发出帖子请求时,我收到此错误 {“message”:“无法读取未定义的属性 'song'”}。所以也许我没有正确设置正文解析
  • 这应该处理 JSON 吗?如果是这样,邮递员会发送content-type: application/json吗? express 是否配置为解析 JSON?
  • 如果你还没有设置body解析中间件,请看github.com/expressjs/body-parser
  • 我在某处看到 express 现在带有正文解析器,所以我没有单独安装正文解析器。我现在就试试。
【解决方案2】:

您已经使用 try ... catch 处理了异常,这很棒。 尽管在此 try catch 之外可能是一个问题。 所以这里可能有两个错误

  1. req.body.songreq.body.artistPlaylist 不是有效的类
  2. 在您的 catch 块 res.status(400).json({ message: err.message }) 这可能是另一个问题。

如果您尝试捕获整个代码块并记录错误,那就太好了。

UnhandledPromiseRejectionWarning 发生是因为你没有捕捉到异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 2018-03-27
    • 2019-11-05
    • 1970-01-01
    相关资源
    最近更新 更多