首页 > 解决方案 > 如何使用 Express 在 NodeJS 的 errorHandler 中间件中返回 JSON 响应?

问题描述

如何使用 Express 从 NodeJS 中的 errorHandler 中间件返回 JSON 响应。我的代码是:

用户控制器.js

const UserService = require("../services/UserService");

exports.createUser = async (req, res) => {
    try {
        throw new Error("Error from UserController");
    } catch (error) {
        throw error;
    }
};

index.js

const express = require("express");
const conectarDB = require("./config/DBConfig");
const cors = require("cors");

//Crear el servidor
const app = express();

//Conectar a la BD
conectarDB();

//Habilitar cors
app.use(cors());

//Habilitar express.json
app.use(express.json({ extended: true }));

//Puerto de la app
const PORT = process.env.PORT || 4000;

//Rutas
app.use("/api/user", require("./routes/UserRoute"));

//ErrorHandler middleware 
app.use(function (err, req, res, next) {
    res.status(500).json({ error: err.message });
});

//Arrancar el app
app.listen(PORT, () => {
    console.log(`El servidor está funcionando en el puerto ${PORT}`);
});

用户路由.js

const express = require("express");
const router = express.Router();
const UserController = require("../controllers/UserController");

router.post("/", UserController.createUser);

module.exports = router;

我想从我的 errorHandler 中间件获得 JSON 响应,如下所示:

{
  error: "Error from UserController"
}

我当前的代码不起作用。它不返回任何 JSON 响应。

提前致谢。

标签: node.jsexpress

解决方案


正如@Won Gyo Seo 所提到的,您需要使用next调用堆栈中的下一个中间件,如果不这样做,您将永远无法访问您的错误处理程序。这意味着将 catch 和 next 放在每条路线上。如果您不想这样做,我理解。

一种方法是制作一个辅助函数

bindAndCatch (fn) {
  return function(req, res, next) {
    fn(req, res, next)
      .then(res.json.bind(res))
      .catch(next)
  }

你现在可以做

router.get('/user', bindAndCatch((req) => {
  return createUser(req.id)
}))

它将返回承诺并捕获错误,调用下一个中间人并将错误传递给它。


推荐阅读