【问题标题】:Handle Unhandling Promise Rejection in nodejs express在节点 js express 中处理未处理的 Promise Rejection
【发布时间】:2019-11-10 01:19:44
【问题描述】:

我有一个 promise 异步函数,我想知道如何捕获 express/nodejs 中的所有错误

如果 getData1 的 Url 无效,应用程序停止声明 unhandled promise rejection failed to fetch value,如何正确处理错误而不导致应用程序崩溃。

//api.js
var express = require('express');
var router = express.Router();
var helper= require('../help.js');

router.get('/', function (req, res) {
   helper.getData1().then(d1=> {
     helper.getData2().then(d2=> {
       return res.status(200).render("home.ejs", {data1: d1, data2:d2});
     })
   }).
   .catch(err => {
       return res.status(400).send({ error: err.message });
   })
})


//help.js
module.exports.getData1= function () {
  return new Promise(async function (resolve, reject) {
    try {
      url = 'https://jsonplaceholder.typicode.com/todos/';
      request.get({ url }, (err, response, body) => {
        if (!err && response.statusCode==200) {
          resolve(JSON.parse(body));
        }
        else if(response.statusCode>=400 && response.statusCode<=500){
          resolve({ errors: response.statusCode + "Error" });
        }
        else {
          resolve({ errors: response.statusCode + ": Not authorised to access requested data" });
        }
      });
    }
    catch (err) {
      reject(new Error("failed to fetch value"));
    }
  })
}


【问题讨论】:

  • 如果您不使用await,则无需在promise 中使用async。您可以添加有问题的错误行吗?
  • @AmolBJamkar 感谢回复,如果网址错误jsonplaceholder.typicode.com/todos1`,我想处理异常,但应用程序崩溃
  • 你有一个catch 代表getDate1,它看起来不错。但是getData2 没有一个,它嵌套在then 中。你确定错误不是来自getData2 吗?

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


【解决方案1】:
  module.exports.getData1 = function () {
return new Promise(async function (resolve, reject) {
    url = 'https://jsonplaceholder.typicode.com/todos/';
    await request.get({ url }, (err, response, body) => {
        if (!err && response.statusCode == 200) {
            resolve(JSON.parse(body));
        }
        else if (response.statusCode >= 400 && response.statusCode <= 500) {
            reject(new Error({ errors: response.statusCode + "Error" }));
        }
        else {
            reject(new Error({ errors: response.statusCode + ": Not authorised to access requested data" }));
        }
    })
}).catch((err)=>{
    reject(new Error("failed to fetch value"));//don't understand why a reject here because catch only works when a promise is rejected.
    console.log(err)// or have an explicit error class and assign its properties
    throw new Error(err);
});

}

你可以使用reject from promises,这会被捕获在你可以重新抛出这个错误的catch部分中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2020-09-13
    • 1970-01-01
    • 2020-08-30
    • 1970-01-01
    相关资源
    最近更新 更多