【问题标题】:Bluebird.js Unhandled Rejection Error using requestBluebird.js 使用请求的未处理拒绝错误
【发布时间】:2017-03-09 16:31:37
【问题描述】:

我正在尝试调用 API 以获取一些数据。当调用返回有效数据时,它就起作用了!但是,当它遇到 API 错误或我想根据数据响应创建的错误时,我会收到以下错误:

Unhandled rejection Error: Data not found!
at Request.request.post [as _callback]
.
.

这些是我正在使用的文件:

let grabSomeData = new BluebirdPromise((resolve, reject) => {

  pullers.grabData(dataID, (err, res) => {

    if (err) {
      return reject(err);
    }

    return resolve(res);
  });


});

grabSomeData.then((fulfilled, rejected) => {
  console.log('res: ' + fulfilled);
  console.log('rej: ' + rejected);
});

在我发出 http 请求的其他文件中,

grabData(dataID, grabDataCallback)  {

  let bodyObj = {
    query: dataByIDQuery,
    variables: {
      id: dataID
    }
  };

  // grab the data
  request.post(
    {
      url: dataURL,
      body: JSON.stringify(bodyObj)
    }, (err, httpResponse, body) => {

        if (err) {
          return grabDataCallback(err);
        }

        let res = JSON.parse(body);

        if (res.data.dataByID !== null) {
          return grabDataCallback(null, res.data.dataByID);
        }

        return grabDataCallback(Boom.notFound('Data not found!'));
      }
  );

}

【问题讨论】:

  • console.log(res.data.dataByID) 带给你什么
  • 当有目的地测试错误时,它不会达到这个程度。它将显示上面的错误。在测试有效数据时,它会很好地打印数据@p0k8_
  • 使用else块中的最后一个return语句if(res.data.dataByID !== null) { return grabDataCallback(null, res.data.dataByID); } else { return grabDataCallback(Boom.notFound('Data not found!')); }
  • @p0k8_ 刚试过这个,我得到了同样的错误。我相信这与我使用回调处理拒绝/解决的方式有关。
  • 是的,您还没有声明 catch 块来处理拒绝

标签: node.js bluebird hapijs


【解决方案1】:

而不是这个:

grabSomeData.then((fulfilled, rejected) => {
  console.log('res: ' + fulfilled);
  console.log('rej: ' + rejected);
});

你需要使用:

grabSomeData.then((fulfilled) => {
  console.log('res: ' + fulfilled);
}, (rejected) => {
  console.log('rej: ' + rejected);
});

或者:

grabSomeData.then((fulfilled) => {
  console.log('res: ' + fulfilled);
}).catch((rejected) => {
  console.log('rej: ' + rejected);
});

有关未处理的拒绝警告(将来将是致命错误)的更多信息,请参阅此答案:

【讨论】:

  • Ok Awesome!,现在同样的原理是否适用于 Promise.all (因为我一次异步拉取多个东西?
  • @nicolascoding 是的。当您运行 Promise.all(...) 时,您要么必须将函数作为参数提供给 then ,如 Promise.all(...).then((val) => console.log('value:', val), (err) => console.log(err)); ,要么将 then 与一个函数一起使用,然后像 Promise.all(...).then((val) => console.log('value:', val)).catch((err) => console.log(err)); 这样使用第二个函数,但您的 val 将是一个数组。
猜你喜欢
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-08
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多