Next.js中间件中throw语句失效问题求助
Next.js中间件异步throw未生效问题解决
问题原因
你的validate是异步函数(声明了async),但在googleAuthValidate中调用时没有加await,导致函数调用后立即继续执行后续代码,异步抛出的错误无法被当前的try/catch块捕获,看起来就像最后一行的throw被忽略了。
解决步骤
- 调用异步函数时添加
await
在googleAuthValidate的try块中,调用validate必须加上await,才能等待异步操作完成并捕获其抛出的错误:
export async function googleAuthValidate(request: NextRequest) { let response = NextResponse.next(); try { await validate(request); // 新增await关键字 console.log("throw didnt go into catch"); } catch (error) { console.error(error); response = NextResponse.rewrite("/unauthorized"); } finally { return response; } }
- 按需处理内部错误的传递(可选)
如果你希望validate内部try块中抛出的错误也能被上层捕获,需要在内部catch中重新抛出错误:
async function validate(request: NextRequest) { const tokenid = "test"; if (tokenid) { try { // in case of error throw new Error("test"); } catch (error) { console.error("validate: ", error); throw error; // 重新抛出错误,让上层try/catch捕获 } } throw new Error("tokenId validation failed"); }
这样修改后,无论是validate内部的错误还是最后一行的验证失败错误,都会被googleAuthValidate中的catch块捕获,从而正确执行重定向逻辑。
内容的提问来源于stack exchange,提问作者jsbisht
相关产品推荐
相关产品推荐

