如何避免代码中多个else分支?登录校验代码优化需求
简化登录校验与重定向代码的方案
嘿,你的问题太常见啦——多层嵌套的if-else确实会让代码变得臃肿又难读,咱们用**提前返回(Early Return)**的技巧就能轻松消除重复的else分支,让逻辑清爽很多!
优化后的代码
static async getInitialProps(context, apolloClient) { const { req } = context; const initProps = {}; // 先检查请求头是否存在,不满足直接重定向返回 if (!req?.headers) { redirect(context, '/login'); return initProps; } const cookies = req.headers.cookie; // 检查cookies是否为有效字符串,不满足直接重定向返回 if (!cookies || typeof cookies !== 'string') { redirect(context, '/login'); return initProps; } const cookiesJSON = jsHttpCookie.parse(cookies); const authToken = cookiesJSON['auth-token']; // 检查token是否存在,不满足直接重定向返回 if (!authToken) { redirect(context, '/login'); return initProps; } // 最后处理token验证逻辑 try { const decoded = jwt.verify(authToken, secret); initProps.id = decoded.id; initProps.token = authToken; } catch (error) { console.error(error); redirect(context, '/login'); } return initProps; }
关键改进说明
- 提前返回拆解嵌套:把所有不满足校验的情况(比如无请求头、无效cookies、无token)都放在代码最前面处理,直接重定向并返回,让核心的token验证逻辑脱离多层
if嵌套,一眼就能看懂。 - 同步化token验证:原代码用了
jwt.verify的回调版本,改成同步的try-catch写法后,逻辑更连贯,也避免了回调嵌套的问题(同步版验证失败会抛出错误,用try-catch捕获即可)。 - 消除重复代码:所有触发重定向的逻辑都拆成独立的检查步骤,再也不用在多个
else里重复写redirect了。 - 可读性大幅提升:每一步校验的目的都清晰分离,后续维护代码的人能快速理清整个校验流程。
如果你的redirect函数本身会终止后续代码执行,后面的return initProps可以根据实际情况调整,但保留它会更稳妥,避免出现意外的代码执行情况。
内容的提问来源于stack exchange,提问作者user3142695
相关产品推荐
相关产品推荐

