当前位置: 首页 > 面试题库 >

防止“未处理的承诺被拒绝”错误

秦权
2023-03-14
问题内容

在我的服务器应用程序中,当用户无权访问端点时,我想返回“禁止”值。

为此,我创建了一个被拒绝的重用承诺:

export const forbidden = Promise.reject(new Error('FORBIDDEN'))

然后在应用程序中的其他位置:

import {forbidden} from './utils'

...

    resolve: (root, {post}, {db, isCollab}) => {
        if (!isCollab) return forbidden
        return db.posts.set(post)
    },

但是,当我启动我的应用程序时,会收到警告

(node:71620) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: FORBIDDEN
(node:71620) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

我怎么能告诉Node这个Promise可以解决呢?


问题答案:

我创建了被拒绝的重用承诺

好吧,仅创建一个可重用的函数可能会容易得多:

export function forbidden() { return Promise.reject(new Error('FORBIDDEN')); }

每次调用该错误时,也会为该错误提供适当的堆栈跟踪。

我怎么能告诉Node这个Promise可以解决呢?

只需不执行任何操作即可:

export const forbidden = Promise.reject(new Error('FORBIDDEN'));
forbidden.catch(err => { /* ignore */ }); // mark error as handled

(并且不要忘记添加有关此看似无操作声明目的的评论)。



 类似资料:
  • 问题内容: 我正在尝试用正确的方法表示正确的方法,以指示内发生故障。 如果诺言没有失败,(即返回诺言的操作是否正常工作,例如返回状态200的AJAX请求),但是我认为结果无效,通常我会这样做弹出窗口,向用户说明问题,然后执行“返回假”;尽早退出该方法。 但是,有了承诺,如果我想从.then()内部做类似的事情,我就被引导去相信我应该做的是抛出一个错误,而应该让它被.catch()抓住。 ),我已经

  • 问题内容: 当我使用Node运行此代码时,它会在控制台中引发错误(甚至首先显示文本)。 但是,当我将方法链接到方法时,错误消失了: 难道第一个代码不应该处理拒绝吗? 我还尝试了Chrome中的第一个代码,当我在新标签页(或google.com)中打开检查器时,该代码就可以使用。如果我在其他任何页面中,则会引发异常。有什么解释吗?这对我来说真的很奇怪! 问题答案: 为了被视为已处理,被拒绝的诺言应与

  • 问题内容: 我在理解为什么拒绝不通过承诺链传递时遇到问题,我希望有人能够帮助我理解原因。对我而言,将功能附加到承诺链上意味着我有意要实现的原始承诺。很难解释,所以让我先显示我的问题的代码示例。(注意:此示例使用的是Node和延迟的节点模块。我使用Dojo 1.8.3对此进行了测试,并得到了相同的结果) 运行此操作的结果是以下输出: 好吧,对我来说,这个结果没有道理。通过附加到该承诺链,每个人都暗示

  • 问题内容: 我在理解为什么拒绝不通过承诺链传递时遇到问题,我希望有人能够帮助我理解原因。对我来说,将功能附加到承诺链上意味着我有意要实现的原始承诺。很难解释,所以让我先显示我的问题的代码示例。(注意:此示例使用的是Node和延迟的节点模块。我使用Dojo 1.8.3对此进行了测试,并得到了相同的结果) 运行此操作的结果是以下输出: 好吧,对我来说,这个结果没有意义。通过附加到这个承诺链,每个人都暗

  • 问题内容: 我需要创建链式承诺: 如果我将errorCallback放在第一个中,则第二个将被解析,并调用其successCallback。但是,如果我删除了,那么第二个承诺将被拒绝。 根据Angular JS的文档,传播拒绝的唯一方法是返回并且它看起来并不明显,尤其是因为即使不需要它,我也必须注入服务。 也可以通过在中引发异常来完成此操作,但是它将异常跟踪写入控制台,这不好。 还有另一种选择可以

  • 问题内容: 我从控制器内部的异步服务获取数据,如下所示: 我的问题: 当我从服务中获得错误而又不返回承诺时,如何再次查询服务。 在我的服务中这样做会更好吗? 谢谢! 问题答案: 您可以在服务本身而不是控制器中重试该请求。 因此,可能是这样的: 您可以摆脱控制器中的错误功能: