You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js中间件中throw语句失效问题求助

Next.js中间件异步throw未生效问题解决

问题原因

你的validate是异步函数(声明了async),但在googleAuthValidate中调用时没有加await,导致函数调用后立即继续执行后续代码,异步抛出的错误无法被当前的try/catch块捕获,看起来就像最后一行的throw被忽略了。

解决步骤

  1. 调用异步函数时添加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;
  }
}
  1. 按需处理内部错误的传递(可选)
    如果你希望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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 06:36:26