错误处理程序中间件不处理错误
Error handler middleware doesn't handle the errors
开始使用这个 npm package 来避免所有 try catch 块和 promises。而且感觉错误处理程序一直是 'sleeping'。也许有人对我在这种情况下做错了什么有任何见解?如果我用 try catch 包装异步函数,它会捕获代码为 23505 的错误 - 所以基本上,处理程序应该解决问题,但它没有。
此外,错误:UnhandledPromiseRejectionWarning:未处理的承诺拒绝。这个错误要么是在没有 catch 块的情况下在异步函数内部抛出,要么是因为拒绝了一个没有用 .catch() 处理的承诺。在未处理的承诺拒绝时终止节点进程。是的,我明白我需要解决这个错误,但这就是我使用中间件 + 包来避免所有 .then.catch
的原因
在我的主文件中 - app.js 在最上面我需要这个包:
require("express-async-errors");
这里我调用了失败的函数(我现在是故意的)
const {hashPassword} = require("../utils/bcryptUtils");
const {registerUserDao} = require("../dao/usersDao");
const registerService = async (requestUser) => {
const registrationPayload = {
email: requestUser.email.toLowerCase(),
password: await hashPassword(requestUser.password),
phone_number: requestUser.phone_number,
first_name: requestUser.first_name.charAt(0).toUpperCase() + requestUser.first_name.slice(1),
last_name: requestUser.last_name.charAt(0).toUpperCase() + requestUser.last_name.slice(1),
};
// If I wrap this await function in try catch I can handle the error here
await registerUserDao(registrationPayload);
};
module.exports = {
registerService
};
道:
const database = require("../database/knex");
const registerUserDao = async (userPayload) => {
return database("users").insert(userPayload).returning("*");
};
module.exports = {
registerUserDao
};
错误处理程序中间件:
const {StatusCodes} = require("http-status-codes");
const errorHandlerMiddleware = (err, req, res, next) => {
console.log(`error activated! ` + err);
let customError = {
statusCode: err.statusCode || StatusCodes.INTERNAL_SERVER_ERROR,
message: err.message || "Something went wrong.. Please try again later."
};
if (err.code === "23505") {
customError.statusCode = 409;
customError.message = "Duplicate error. Client with provided data already exsists";
}
return res.status(customError.statusCode).json({message: customError.message});
};
module.exports = errorHandlerMiddleware;
我肯定会把它添加到我的路线的最后:
// middlewares
const errorHandlerMiddleware = require("./middlewares/errorHandlerMiddleware");
// routes
app.use("/api/v1/auth", authRouter);
app.use(errorHandlerMiddleware);
这里调用registerService
const {registerService} = require("../services/authServices");
const {StatusCodes} = require("http-status-codes");
// Yup I see the issue now! Been missing await before
const registerController = async (req, res) => {
const response = registerService(req.body);
res.status(StatusCodes.CREATED).json({response});
};
module.exports = {
registerController
};
中间件功能似乎没有return(最终被拒绝)承诺,所以包的代码永远看不到它。
很可能在调用 registerService
时(或调用堆栈中更高的地方),您缺少 await
关键字。
开始使用这个 npm package 来避免所有 try catch 块和 promises。而且感觉错误处理程序一直是 'sleeping'。也许有人对我在这种情况下做错了什么有任何见解?如果我用 try catch 包装异步函数,它会捕获代码为 23505 的错误 - 所以基本上,处理程序应该解决问题,但它没有。 此外,错误:UnhandledPromiseRejectionWarning:未处理的承诺拒绝。这个错误要么是在没有 catch 块的情况下在异步函数内部抛出,要么是因为拒绝了一个没有用 .catch() 处理的承诺。在未处理的承诺拒绝时终止节点进程。是的,我明白我需要解决这个错误,但这就是我使用中间件 + 包来避免所有 .then.catch
的原因在我的主文件中 - app.js 在最上面我需要这个包:
require("express-async-errors");
这里我调用了失败的函数(我现在是故意的)
const {hashPassword} = require("../utils/bcryptUtils");
const {registerUserDao} = require("../dao/usersDao");
const registerService = async (requestUser) => {
const registrationPayload = {
email: requestUser.email.toLowerCase(),
password: await hashPassword(requestUser.password),
phone_number: requestUser.phone_number,
first_name: requestUser.first_name.charAt(0).toUpperCase() + requestUser.first_name.slice(1),
last_name: requestUser.last_name.charAt(0).toUpperCase() + requestUser.last_name.slice(1),
};
// If I wrap this await function in try catch I can handle the error here
await registerUserDao(registrationPayload);
};
module.exports = {
registerService
};
道:
const database = require("../database/knex");
const registerUserDao = async (userPayload) => {
return database("users").insert(userPayload).returning("*");
};
module.exports = {
registerUserDao
};
错误处理程序中间件:
const {StatusCodes} = require("http-status-codes");
const errorHandlerMiddleware = (err, req, res, next) => {
console.log(`error activated! ` + err);
let customError = {
statusCode: err.statusCode || StatusCodes.INTERNAL_SERVER_ERROR,
message: err.message || "Something went wrong.. Please try again later."
};
if (err.code === "23505") {
customError.statusCode = 409;
customError.message = "Duplicate error. Client with provided data already exsists";
}
return res.status(customError.statusCode).json({message: customError.message});
};
module.exports = errorHandlerMiddleware;
我肯定会把它添加到我的路线的最后:
// middlewares
const errorHandlerMiddleware = require("./middlewares/errorHandlerMiddleware");
// routes
app.use("/api/v1/auth", authRouter);
app.use(errorHandlerMiddleware);
这里调用registerService
const {registerService} = require("../services/authServices");
const {StatusCodes} = require("http-status-codes");
// Yup I see the issue now! Been missing await before
const registerController = async (req, res) => {
const response = registerService(req.body);
res.status(StatusCodes.CREATED).json({response});
};
module.exports = {
registerController
};
中间件功能似乎没有return(最终被拒绝)承诺,所以包的代码永远看不到它。
很可能在调用 registerService
时(或调用堆栈中更高的地方),您缺少 await
关键字。