node.js - Express中全域異常處理
PHPz
PHPz 2017-05-16 13:35:30
0
2
1677

1、如下server配置來捕捉路由的異常是否正確?
server.js

const express = require("express");
const app = express();

// ...加载中间件


// ...配置路由

// 异常处理
// 如果是开发环境,则打印异常到控制台
if (app.get("env") === "development") {
  app.use((err, req, res, next) => {
    console.error("Error",err);
    next(err);
  });
}

// 如果是非开发环境,则向页面输出错误信息
app.use((err, req, res, next) => {
  res.status(err.status || 500);
  res.render("error", {
    message: err.message,
    error: {}
  });
});

app.listen(3000);

2、下面是一個路由對象,在沒有promise(async/await)的情況下會正常拋出異常,並在server中捕獲
xxxRouter.js

#
const router = require("express").Router();

router.all("/test/error", (req, res) => {
    throw new Error("我就是异常!!!");
});

但是在promise(async/await)的情況下則會在控制台報錯,server中捕獲無法捕獲導致q超時

(node:30875) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: 我就是异常!!!
(node:30875) 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.

xxxRouter.js

const router = require("express").Router();

router.all("/test/error", async(req, res) => {
    throw new Error("我就是异常!!!");
});

3、實際使用時每一個路由都要try/catch並且處理異常,感覺非常的冗餘

// 冗余的router
router.all("/test1", async(req, res) => {
    try{
       // ...处理一些事务
       // ...各种 await
       res.end(
           // 成功返回内容
       );
    }catch(err){
        // 此处希望throw err 让server接收并处理,但是会报错
        res.end(
           // 失败返回内容
       );
    }
});
// ...之后还有很多router都要try/catch依次处理异常
=、=
PHPz
PHPz

学习是最好的投资!

全部回覆(2)
伊谢尔伦

async 函數傳回一個 Promise 对象,这个函数中抛出的异常需要通过 Promise 对象的 catch()then() 的第 2 個參數來處理。

當然如想外層函數用了 await,就不是用 catch()then() 来处理了,而是像同步调用那样用 try ... catch ... 來處理。

我的印像中 Express 本身是不支援 Promise/yield/async/await 的(不知道新版本是否發展了相關的支援)。現在一般用對 Promise/yield/async/await 支持得比較好的 Koa。

曾经蜡笔没有小新

process.on('unhandledRejection', processErrorHandler);

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板