错误中间件在使用 express 和云函数制作的后端中不起作用

Error middleware not working in backend made with express and cloud functions

我正在尝试使用带有错误中间件的 express 处理错误。这是我的指数:

const functions = require("firebase-functions");
const express = require("express");
const cors = require("cors");
require("dotenv").config();
const methodOverride = require('method-override')

const {logErrors, errorHandler,boomErrorHandler, error404Handler } = require("./src/middlewares/error.handler")
//modulos personalizados
const { productsRoutes } = require("./src/products/products.routes");
const userRoutes = require("./src/users/user.routes");
const UserServices = require("./src/users/user.services")
//nombre
const userService = new UserServices

const app = express();
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.use(cors({ origin: true }));

app.use(methodOverride());
app.use(logErrors);
app.use(boomErrorHandler);
app.use(errorHandler);
// app.use(error404Handler);


exports.setCustomerClaim = functions.auth
.user()
.onCreate(userService.customerClaimServ)

productsRoutes(app);

exports.api = functions.https.onRequest(app);

如你所见,我有 logErrors 中间件。

这是我的简单控制器,它可以正常运行,但是当我在 catch() 中执行 next() 时,它不会进入错误中间件。

这是我的控制器:

async function getAll(req, res, next) {
  try {
    const products = await productServices.getAllSer();
    console.log("Aca esta tu error");
    res.json(products);
  } catch (error) {
    next();
  }
}

这是我的中间件:

/* eslint-disable @typescript-eslint/no-var-requires */
const boom = require("@hapi/boom");

function logErrors(err, req, res, next) {
  console.error(err);
  next(err);
}

function errorHandler(err, req, res, next) {
  if (err) {
    res.status(409).json({
      message: err.message,
      stack: err.stack,
    });
  } else {
    next(err);
  }
}

function boomErrorHandler(err, req, res, next) {
  if (err.isBoom) {
    const {output} = err;
    res.status(output.statusCode).json(output.payload);
  }
  next(err);
}
function error404Handler (req, res) {
  res.status(404)
  res.send ({
  message: boom.notFound('el recurso que busca no existe')
  })
}

module.exports= {
  logErrors,
  errorHandler,
  boomErrorHandler,
  error404Handler
};

问题是,它没有进入错误中间件,因为 next() 之前的任何东西都工作正常。

如有任何帮助,我将不胜感激。提前致谢!

你的问题出在控制器上,这样使用return next(error);:

async function getAll(req, res, next) {
  try {
    const products = await productServices.getAllSer();
    console.log("Aca esta tu error");
    res.json(products);
  } catch (error) {
    return next(error);
  }
}