最近在写 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()};
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.