找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 126|回复: 0

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

[复制链接]

1088

主题

0

回帖

3292

积分

管理员

积分
3292
发表于 2023-12-8 10:05:15 | 显示全部楼层 |阅读模式
最近在写 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()};

    }



https://github.com/scopsy/await-to-js
@zzetao 试过了不太行。。
没用过 express,查文档查到的: https://expressjs.com/zh-cn/guide/error-handling.html按理说作为 node web 框架鼻祖,大家的处理方式应该都差不多,一个 middleware 就应该能搞定才是。
nestjs 解君愁
@knives 我第一个也想到的是 middleware
中间件,不管 node 哪个框架
google `express global error handling`https://expressjs.com/en/guide/error-handling.html
app.use(function(err, req, res, next) { console.error(err.stack); res.status(500).send('Something broke!');});
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|张迁碑

GMT+8, 2024-5-19 16:53 , Processed in 0.175454 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表