node.js - Pengendalian pengecualian global dalam Express
PHPz
PHPz 2017-05-16 13:35:30
0
2
1675

1. Adakah konfigurasi pelayan berikut untuk menangkap pengecualian penghalaan betul?
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. Berikut ialah objek penghalaan Jika tiada janji (async/menunggu), pengecualian akan dilemparkan secara normal dan ditangkap dalam pelayan
xxxRouter.js

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

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

Tetapi dalam kes promise (async/wait), ralat akan dilaporkan dalam konsol, dan tangkapan dalam pelayan tidak dapat ditangkap, mengakibatkan q tamat masa

(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 Dalam penggunaan sebenar, setiap laluan mesti mencuba/menangkap dan mengendalikan pengecualian, yang terasa sangat berlebihan

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

学习是最好的投资!

membalas semua(2)
伊谢尔伦

Fungsi async mengembalikan objek Promise Pengecualian yang dilemparkan dalam fungsi ini perlu menghantar catch() atau then( ) untuk mengendalikan. parameter kedua. Promise 对象,这个函数中抛出的异常需要通过 Promise 对象的 catch()then() 的第 2 个参数来处理。

当然如想外层函数用了 await,就不是用 catch()then() 来处理了,而是像同步调用那样用 try ... catch ...

Sudah tentu, jika fungsi luar menggunakan menunggu, ia tidak akan dikendalikan dengan catch() atau then(), tetapi seperti penggunaan penyegerakan cuba ... tangkap ... untuk mengendalikan panggilan.

Dalam tanggapan saya, Express sendiri tidak menyokong Promise/yield/async/wait (saya tidak tahu sama ada versi baharu telah membangunkan sokongan berkaitan). Pada masa kini, Koa, yang mempunyai sokongan yang lebih baik untuk Promise/yield/async/wait, biasanya digunakan. 🎜
曾经蜡笔没有小新

process.on('unhandledRejection', processErrorHandler);

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan