node.js - 如何使用 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 响应。
提前致谢。
解决方案
正如@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)
}))
它将返回承诺并捕获错误,调用下一个中间人并将错误传递给它。
推荐阅读
- xml - 如何输出状态数据?
- java - 在 Android/data/package-name 上保存数据有什么限制?
- php - 启用 Memcached 后,codeigniter 中出现与会话相关的未知错误
- java - 如何更改图像位深?
- spring - 使用@value将bean值注入属性不起作用
- java - Java Stream lifecycle callbacks
- google-bigquery - BigQuery - WITH 语句 - 在后面的子查询中引用 WHERE 条件中的早期子查询
- python - PIP 升级会影响什么?
- android - 如何使用 SVG 创建动画
- string - 使用 pyspark 将字符串转换为日期