node.js - Gestion globale des exceptions dans Express
PHPz
PHPz 2017-05-16 13:35:30
0
2
1704

1. La configuration de serveur suivante pour capturer les exceptions de routage est-elle correcte ?
serveur.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. Ce qui suit est un objet de routage En l'absence de promesse (async/await), une exception sera levée normalement et capturée dans le serveur
xxxRouter.js

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

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

Mais en cas de promesse (async/await), une erreur sera signalée dans la console, et la capture sur le serveur ne pourra pas être capturée, ce qui entraînera q timeout

(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. En utilisation réelle, chaque itinéraire doit essayer/capter et gérer les exceptions, ce qui semble très redondant

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

学习是最好的投资!

répondre à tous(2)
伊谢尔伦

La fonction asynchrone renvoie un objet Promise. L'exception levée dans cette fonction doit transmettre le catch() ou le then( ) pour gérer le deuxième paramètre. Promise 对象,这个函数中抛出的异常需要通过 Promise 对象的 catch()then() 的第 2 个参数来处理。

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

Bien sûr, si la fonction externe utilise await, elle ne sera pas gérée avec catch() ou then(), mais comme la synchronisation. Utilisez essayez ... catch ... pour gérer l'appel.

À mon avis, Express lui-même ne prend pas en charge Promise/yield/async/await (je ne sais pas si la nouvelle version a développé un support pertinent). De nos jours, Koa, qui prend mieux en charge Promise/yield/async/await, est généralement utilisé. 🎜
曾经蜡笔没有小新

process.on('unhandledRejection', processErrorHandler);

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal