NodeJS 如何在不使用控制器中的try和catch的情况下全局处理express中的错误

kgqe7b3p  于 2023-08-04  发布在  Node.js
关注(0)|答案(2)|浏览(117)

我是相当新的表达,并想知道是否存在一个全局错误捕捉器。我正在处理一个已经存在的代码与所有的控制器创建,这将是菜鸟实现尝试和捕捉在所有的控制器。我需要一个全局错误捕捉器来检测代码中的中断并响应客户端。是否存在用于该功能的现有库或现有代码实现。

hjqgdpho

hjqgdpho1#

如果你的控制器不是异步的,你可以简单地在注册所有路由后添加错误处理程序

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
    throw new Error('Something went wrong');
});

// Add more routes here

// Error handler
app.use(function (err, req, res, next) {
    // All errors from non-async route above will be handled here
    res.status(500).send(err.message)
});

app.listen(port);

字符串
如果你的控制器是异步的,你需要添加一个自定义的中间件到你的控制器来处理异步错误。中间件示例取自this answer

const express = require('express');
const app = express();
const port = 3000;

// Error handler middleware for async controller
const asyncHandler = fn => (req, res, next) => {
    return Promise
        .resolve(fn(req, res, next))
        .catch(next);
};

app.get('/', asyncHandler(async (req, res) => {
    throw new Error("Something went wrong!");
}));

// Add more routes here

// Error handler
app.use(function (err, req, res, next) {
    // All errors from async & non-async route above will be handled here
    res.status(500).send(err.message)
})

app.listen(port);

r9f1avp5

r9f1avp52#

如果你是2017年以后出生的,这里有一个异步等待版本

import express from 'express';

const app = express();
const port = 3000;

// Error handler middleware for async controller
function asyncErrorHandler(fn) {
  return async (req, res, next) => {
    try {
      await fn(req, res, next)
    } catch (e) {
      return next(e)
    }
  }
};

app.get('/', asyncErrorHandler(async (req, res) => {
  throw new Error("Something went wrong!");
}));

// Error handler
app.use(function (err, req, res, next) {
  // All errors from async & non-async route above will be handled here
  if (err) {
    // console.log(err)
    return (
      err.message ? res.status(err.statusCode || 500).send(err.message) : res.sendStatus(500)
    )
  }
  next()
})

app.listen(port);

字符串

相关问题