首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误处理程序中间件不处理错误

错误处理程序中间件不处理错误
EN

Stack Overflow用户
提问于 2022-01-26 09:10:36
回答 1查看 567关注 0票数 1

开始使用这个npm 套餐,以避免所有的尝试捕获块和承诺。而且它感觉到错误处理程序一直在“睡觉”。也许有人知道我在这件事上做错了什么?如果我用try包装异步函数,它会用代码23505捕获错误--所以基本上,处理程序应该解决这个问题,但它没有解决。另外,错误: UnhandledPromiseRejectionWarning: Unhandled允诺拒绝。此错误起源于在异步函数中抛出而不带catch块,或者拒绝使用.catch()处理的承诺。若要在未处理的承诺拒绝上终止节点进程,请执行以下操作。是的,我明白我需要解决这个错误,但这就是为什么我使用中间件+包来避免所有的.then.catch

在我的主文件-最上面的app.js中,我需要这个包:

代码语言:javascript
复制
require("express-async-errors");

在这里,我调用失败的函数(我现在是故意的)

代码语言:javascript
复制
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
};

而刀:

代码语言:javascript
复制
const database = require("../database/knex");

const registerUserDao = async (userPayload) => {
    return database("users").insert(userPayload).returning("*");

};

module.exports = {
    registerUserDao
};

错误处理中间件:

代码语言:javascript
复制
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;

当然,我把它添加到了我的路线的尽头:

代码语言:javascript
复制
// middlewares
const errorHandlerMiddleware = require("./middlewares/errorHandlerMiddleware");

// routes
app.use("/api/v1/auth", authRouter);

app.use(errorHandlerMiddleware);

这里我叫registerService

代码语言:javascript
复制
    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
    };
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-26 09:35:05

似乎中间件功能没有返回(最终被拒绝)承诺,所以包的代码永远看不到它。

很可能在调用registerService时(或者在调用堆栈的较高位置),您缺少了一个await关键字。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70860948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档