gpt4 book ai didi

javascript - 为什么我的 ExpressJS 错误处理程序不起作用?

转载 作者:行者123 更新时间:2023-12-01 00:00:06 24 4
gpt4 key购买 nike

我正在使用 ExpressJS 为我的一个项目构建一个 api,并希望实现错误处理。我在互联网上阅读了一些关于如何执行此操作的文章,并尝试了几种在我的 api 中实现错误处理的方法。我现在遇到的问题是我的错误处理程序不起作用,我不知道为什么。为了让我的问题更清楚,这是我已经尝试过的:

这是我的 index.js 文件的底部:

// Controllers
app.use("/auth", require("./controllers/auth"));
app.use("/clients", require("./controllers/clients"));

// Error handling
app.use((err, req, res, next) => {
logger.error(
`date - ${new Date()}, message - ${err.message}, stack trace - ${
err.stack
}`
);

return res
.status(500)
.json({ status: 500, message: "Something went wrong." });
});

const PORT = process.env.PORT || 3001;
app.listen(3001, () => {
console.log(`Listening on port ${PORT}`);
});

顺便说一句:我使用 WinstonJS 将错误记录到文件中,并使用 Mongoose 作为 MongoDB 数据库的 ORM。

这是客户端路由的 Controller (controllers/clients.js):

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

const ClientsService = require("../services/clients");

// GET -> Get all clients -> /clients
router.get("/", async (req, res) => {
const clients = await ClientsService.getAll();

return res.status(200).json({ status: 200, data: clients });
});

module.exports = router;

最后,这是客户端服务(services/clients.js),我想在其中抛出错误(也许这不是抛出错误的正确位置,如果我错了,请纠正我):

const ClientModel = require("../models/Client");

const getAll = async () => {
return ClientModel.findById({})
.then(clients => clients)
.catch(err => {
throw new Error(err);
});
};

module.exports = { getAll };

如您所见,我在 findById 函数中放置了一个空对象。这是为了强制发生错误,以便我可以测试错误处理。下面几行,我抛出一个错误。我希望这会触发我在 index.js 中定义的中间件函数。该中间件函数(如 index.js 代码所示)将错误记录到文件中,然后向客户端发送 500 响应(读取“用户”)。

事实上,我在控制台中收到了一个名为“UnhandledPromiseRejectionWarning”的错误。错误如下:

(node:15416) UnhandledPromiseRejectionWarning: Error: CastError: Cast to ObjectId failed for value "{}" at path "_id" for model "clients"
at D:\projects\myproject\services\clients.js:7:10
at processTicksAndRejections (internal/process/task_queues.js:97:5)
at async D:\projects\myproject\controllers\clients.js:8:18
(node:15416) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:15416) [DEP0018] 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.

为什么我的错误处理不起作用?如果您有解决方案,我将如何为我的代码启用错误处理?

提前谢谢您!

最佳答案

express error handling文档,它说:

You must catch errors that occur in asynchronous code invoked by route handlers or middleware and pass them to Express for processing.

因此您需要捕获错误,并使用 next(err) 将其传递给快速错误中间件:

所以你的 Controller 需要像这样更新:

router.get("/", async (req, res, next) => {
try {
const clients = await ClientsService.getAll();
return res.status(200).json({ status: 200, data: clients });
} catch (err) {
next(err);
}
});

此外,您最好从您的服务中返回一个 promise ,这样更清楚:

const getAll = () => {
return ClientModel.findById({});
};

现在,如果您担心在每条 route 都使用 try catch,您可以检查 this回答以避免它。

关于javascript - 为什么我的 ExpressJS 错误处理程序不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60787474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com