Javascript 未处理的PromisejectionWarning:API的未处理承诺拒绝

Javascript 未处理的PromisejectionWarning:API的未处理承诺拒绝,javascript,node.js,json,es6-promise,Javascript,Node.js,Json,Es6 Promise,我正在尝试console.log一些气象API的数据,但当我查找某个位置时,会收到错误消息 未处理的PromisejectionWarning:未处理的承诺拒绝。此错误源于在没有catch块的异步函数中抛出,或者拒绝未使用.catch()处理的承诺。(拒绝id:4) 到目前为止,我的代码在我的服务器上 app.post('/weather', (req, res) => { const url = `https://api.darksky.net/forecast/${DARKSK

我正在尝试console.log一些气象API的数据,但当我查找某个位置时,会收到错误消息

未处理的PromisejectionWarning:未处理的承诺拒绝。此错误源于在没有catch块的异步函数中抛出,或者拒绝未使用.catch()处理的承诺。(拒绝id:4)

到目前为止,我的代码在我的服务器上

app.post('/weather', (req, res) => {
    const url = `https://api.darksky.net/forecast/${DARKSKY_API_KEY}/${req.body.latitude},${req.body.longitude}?units=auto`
    axios({
      url: url,
      responseType: 'json'
    }).then(data => res.json(data.data.currently)).catch(error => { throw error})
  })

app.listen(3000, () => {
    console.log("Server has started")
})
还有我的Javascript

  fetch('/weather', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Accept': 'application/json'
    },
    body: JSON.stringify({
      latitude: latitude,
      longitude: longitude
    })
  }).then(res => res.json()).then(data => {
    console.log(data)
    setWeatherData(data, place.formatted_address)
  }).catch(error => { throw error})
})
您的代码:

axios(...).then(...).catch(error => { throw error;})
如果您的
axios()
调用或
.then()
处理程序被拒绝,将导致该警告

当您在
.catch()
处理程序中抛出错误,使承诺链处于拒绝状态,并且您没有其他代码来捕获该拒绝

同样的问题也适用于客户端代码


您还应该了解,
.catch(error=>{throw error;})
绝对没有任何用处。它捕捉到拒绝,然后抛出,这只是再次拒绝链。而且,因为没有其他东西在听承诺链,这是一个未经处理的拒绝

相反,您需要做的是以适合您的应用程序的方式实际处理错误,例如将错误状态发送回客户端

axios(...).then(...).catch(error => {
    console.log(err);
    res.sendStatus(500);
});

在客户机中,您可以向用户显示错误消息,也可以只记录错误。如果没有人在听,就重发错误,这对你没有好处

我刚开始时也做了同样的事情。:)

你不会从接球手的手套里扔棒球,所以你也不应该从
catch
方法中扔错误。但是,您可以从
然后
方法抛出,它将被以下
捕获
方法捕获

无论如何,您应该在catch方法中处理错误。在大多数情况下,如果是真正的错误,错误将自动发送到catch方法。如果它是一个隐藏在成功的API请求中的错误,那么您必须手动抛出错误,就像我上面提到的那样

.catch(error=>您的CustomErrorHandler应该在全球范围内可用,并且最终不超过一个时间长度(error))

您的自定义错误处理程序可以执行任何您想要的操作。你可以将它转发给你用来追踪车祸的服务,你可以向页面访问者显示一些东西,你可以将它打印到控制台,让页面快速旋转并爆炸,创建一个动画猫暴雨,重定向到达斯维德大喊“Noooooo!”。天空是极限。

这是错误的,你永远不会从
.catch()
抛出。在许多情况下,从
.catch()
抛出是有意义的。事实上,.catch(err=>{console.log(err);throw err});这正是您记录错误然后让它继续传播回调用方的方式。但是,您只会在其他代码正在侦听被拒绝的承诺(OP的代码没有)时才这样做。我不明白这篇文章与任何事情有什么关系。是的,您可以使用
.then()
处理程序中的
throw err
将承诺更改为拒绝链,但也可以从
.catch()
中使用它来实现相同的目的。你回答的第一句话完全错了。你可以从
.catch()
中抛出,当你有其他代码监视该链并随后捕获该错误时,你有理由这样做。这篇文章很有意义,因为它提供了一个在捕获内部抛出的示例,同时也解释了为什么从捕获(黑洞)中抛出是不好的。我提供它作为您和OP的一个示例。现在,我个人更希望清楚、简单、简洁地处理catch方法中的错误,而不是让错误通过一系列catch方法抛出。如果你喜欢,那是你的选择。感谢您的输入。从
setTimeout()
抛出是一个黑洞。那完全不同。这与从任何普通异步回调抛出相同。这就是承诺优于普通回调(更容易传播错误)的原因之一。许多受人尊重的代码都会找到理由,抓住被拒绝的承诺,做点什么,然后重新引用。这里有一个简单的例子。打开一个文件,然后开始写入(使用承诺)。在
.catch()
中出现错误。您关闭该文件,甚至可能删除它,然后从
.catch()
中抛出错误,这样承诺将被拒绝,调用者将获得错误。我可以通过承诺解决问题。但我现在收到一个状态为的请求失败403@faizan_khan98-403是特定于您的端点的。与特定资源的授权有关,客户机通常被授权,但不允许访问该特定资源。现在,并非所有服务器都以正确的方式实现其4xx代码,因此您必须与您的端点一起找出获得403的原因。我将首先验证URL中的所有内容是否完全正确,然后验证您拥有的任何授权或API密钥是否正确。
axios({
      url: url,
      responseType: 'json'
    }).then(data => res.json(data.data.currently)).catch(error => { console.error(error)})