V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
AkideLiu
V2EX  ›  Node.js

NodeJs 使用 express 和 typeorm 的项目如何实现 Global Error Handling

  •  
  •   AkideLiu · 173 天前 · 972 次点击
    这是一个创建于 173 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在写 nodejs,遇到了一个问题很迷幻。

    如何在 controller/router 层来处理 services 或则 repository 层传递过来的错误呢?

    现在是用 try catch 代码实在是太丑了。

    我想实现的是类似于 Spring boot 的 controllerAdvise/ExceptionHandler 这种形式

    网上搜了一圈也没啥好的办法,希望大佬们给点意见

    例子如下:

    router:

    
        async login(req: Request, res: Response) {
    
            try {
                const {user, accessToken} = await this.userRepository.findAndGenerateToken(req.body);
    
                const token = await AuthService.generateTokenResponse(user, accessToken);
    
                if (user.Role[0].role_id !== 3 && user.is_approval === false) {
                    return ApiResultBean.errorMessage("User need to be approve!!");
                }
    
                if (token instanceof Error) {
                    return ApiResultBean.error(req, token);
                }
    
                return ApiResultBean.success({token, user});
    
            } catch (error){
    
                // res.status(error.statusCode)
                console.log(error);
                if (error.output.payload) {
                    return ApiResultBean.error(req, error,error.output.payload.message);
                }
                return ApiResultBean.error(req, error);
    
            }
    
    
        }
    

    repository 层:

    
           public async findAndGenerateToken(options: tokenOptions): Promise<{ user: User, accessToken: string; }> {
    
                const {username, emailAddress, password, refreshToken} = options;
    
                if (!emailAddress && !username) {
                    throw badRequest("An email address or username is required to generate a token");
                }
    
                let user;
    
                try {
                    user = await this.findOne({
                        relations: ['Role'],
                        where: emailAddress ? {emailAddress: emailAddress} : {username: username}
                    });
                }catch (error) {
                    return error;
                }
    
    
                if (!user) {
                    throw notFound('User not found');
                } else if (password && await user.passwordMatches(password.toString()) === false) {
                    throw unauthorized('Password must match to authorize a token generating');
                } else if (refreshToken && refreshToken.user.emailAddress === emailAddress && Dayjs(refreshToken.expires).isBefore(Dayjs())) {
                    throw unauthorized('Invalid refresh token');
                }
                return {user, accessToken: user.token()};
    
        }
    
    
    8 条回复    2021-07-19 17:15:22 +08:00
    AkideLiu
        2
    AkideLiu   173 天前
    @zzetao 试过了不太行。。
    knives
        3
    knives   172 天前
    没用过 express,查文档查到的: https://expressjs.com/zh-cn/guide/error-handling.html

    按理说作为 node web 框架鼻祖,大家的处理方式应该都差不多,一个 middleware 就应该能搞定才是。
    hongweiliuruige
        4
    hongweiliuruige   172 天前
    nestjs 解君愁
    ChevalierLxc
        5
    ChevalierLxc   172 天前
    @knives 我第一个也想到的是 middleware
    LawlietZ
        6
    LawlietZ   172 天前
    中间件,不管 node 哪个框架
    leopod1995
        7
    leopod1995   172 天前
    google `express global error handling`
    https://expressjs.com/en/guide/error-handling.html
    xcstream
        8
    xcstream   132 天前
    app.use(function(err, req, res, next) {
    console.error(err.stack);
    res.status(500).send('Something broke!');
    });
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1023 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 18:55 · PVG 02:55 · LAX 10:55 · JFK 13:55
    ♥ Do have faith in what you're doing.