UnhandledPromiseRejectionWarning:Node.JS中的未处理承诺拒绝(拒绝ID:1)

时间:2017-11-29 07:54:01

标签: javascript node.js async-await

您好我正在尝试调用返回promise的异步函数makeRemoteExecutableSchema

async function run() {
  const schema = await makeRemoteExecutableSchema(
    createApolloFetch({
      uri: "https://5rrx10z19.lp.gql.zone/graphql"
    })
  );
}

我在构造函数中调用此函数。

class HelloWorld {
  constructor() {
      try {
        run();
      } catch (e) {
        console.log(e, e.message, e.stack);
      }
   }
}   

我收到此错误。有谁知道如何解决这个问题?

(node:19168) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: Cannot read property 'getQueryType' of undefined
(node:19168) [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.

1 个答案:

答案 0 :(得分:5)

如果makeRemoteExecutableScheme()返回最终拒绝的承诺,那么您没有代码来处理拒绝。您可以通过以下两种方式之一处理它:

async function run() {
  try {
      const schema = await makeRemoteExecutableSchema(
        createApolloFetch({
          uri: "https://5rrx10z19.lp.gql.zone/graphql"
        })
      );
   } catch(e) {
      // handle the rejection here
   }
}

或者在这里:

class HelloWorld {
  constructor() {
        run().catch(err => {
           // handle rejection here
        });
   }
}  

您在try/catch周围和同一个功能中使用await。一个run()已经返回,您只是处理了此时的承诺,因此您可以使用.catch()而不是try/catch来解决拒绝问题。

重要的是要记住,await只是函数中.then()的语法糖。除了该功能之外,它不会应用任何魔法。一旦run()返回,它就会返回一个常规的承诺,所以如果你想要从退回的承诺中捕获拒绝,你必须使用.catch()await它再次然后用try/catch包围它。围绕与try/catch的一个期待已久的承诺并没有抓住你正在做的被拒绝的承诺。