開始使用這個 npm包來避免所有 try catch 塊和承諾。并且感覺錯誤處理程式一直在“睡覺”。也許有人對我在這種情況下做錯了什么有任何見解?如果我用 try catch 包裝異步函式,它會用代碼 23505 捕獲錯誤 - 所以基本上,處理程式應該解決問題,但它沒有。此外,錯誤: UnhandledPromiseRejectionWarning: Unhandled Promise Rejection。此錯誤源于在沒有 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
};
uj5u.com熱心網友回復:
似乎中間件函式沒有回傳(最終被拒絕的)承諾,所以包的代碼永遠看不到它。
在您呼叫registerService(或呼叫堆疊中更高的位置)時,您可能缺少await關鍵字。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/422743.html
標籤:
