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

Next.js POST接口提前终止报错:Cannot read properties of undefined (reading 'headers')

解决SQL Server BulkLoad回调未完成前POST函数提前返回的问题

问题原因

你的代码核心问题在于基于回调的异步操作与async/await风格不兼容:

  • connection.newBulkLoad和connection.execBulkLoad是回调式异步API,但外层POST函数是async函数,没有等待回调执行完成就走完了try代码块,函数提前返回,导致服务器无法获取有效响应,返回500错误。
  • 回调内返回的NextResponse.json属于回调函数的返回值,不会成为POST函数的返回值,完全起不到响应客户端的作用。

解决方案

将回调式的bulkLoad操作包装成Promise,用await等待异步操作完成,确保POST函数只有在bulkLoad全部执行完毕后才返回响应。

修改后的完整代码

export async function POST(request: NextRequest) {
  try {
    const data = await request.json();
    const excelData: ExcelDataProps[] = data.excelData;
    appValidationID = data.appValidationID;
    const connection: Connection = await connectToSQLServer();

    // 将bulkLoad回调包装为Promise,统一管理异步流程
    const bulkLoadResult = await new Promise((resolve, reject) => {
      const bulkLoad = connection.newBulkLoad(TABLE_NAME, (error, rowCount) => {
        if (error) {
          console.log(error.message);
          reject(error); // 错误时抛出,交由外层catch处理
          return;
        }
        resolve(rowCount); // 成功时返回插入行数
      });

      const columns = [
        { name: "TASK_ID", type: TYPES.Int, nullable: false },
        {
          name: "TESTCASE_NUM",
          type: TYPES.VarChar,
          length: 100,
          nullable: false,
        },
        {
          name: "ISSUE_TITLE",
          type: TYPES.VarChar,
          length: "max",
          nullable: false,
        },
        {
          name: "ISSUE_Recommendation",
          type: TYPES.VarChar,
          length: "max",
          nullable: true,
        },
        { name: "STATUS", type: TYPES.VarChar, length: 25, nullable: false },
        { name: "GUID", type: TYPES.VarChar, length: 100, nullable: false },
      ];

      columns.forEach((col) => {
        bulkLoad?.addColumn(col.name, col.type, {
          nullable: col.nullable,
          length: col.length,
        });
      });

      const uniqueId = uuid4();
      const dataToBeAdded = excelData.map((row) => {
        return {
          TASK_ID: appValidationID,
          TESTCASE_NUM: row.TestCase_NUM,
          ISSUE_TITLE: row.Issue_Title,
          ISSUE_Recommendation: row.Issue_Recommendation,
          STATUS: row.Status,
          GUID: uniqueId,
        };
      });

      if (bulkLoad) connection.execBulkLoad(bulkLoad, dataToBeAdded);
    });

    // 操作完成后关闭连接,返回成功响应
    connection.close();
    return NextResponse.json(
      { mssg: `${bulkLoadResult} rows inserted...` },
      { status: 200, statusText: "OK" }
    );

  } catch (error: any) {
    console.log(error);
    // 统一捕获所有错误,返回错误响应
    return NextResponse.json(
      { mssg: error.message || "Unable to make connection to sql..." },
      { status: 500, statusText: "Internal Server Error" }
    );
  }
}

关键修改点说明

  • Promise包装异步流程:把bulkLoad的创建、配置、执行逻辑全部放进Promise,用resolve和reject传递异步结果,让外层可以用await等待操作完成。
  • 统一响应出口:成功响应在Promise执行完成后统一返回,错误通过reject抛给外层catch块处理,确保所有代码路径都有明确的return NextResponse,避免函数无返回值导致的500错误。
  • 合理的连接关闭时机:确保bulkLoad操作成功完成后再关闭数据库连接,避免提前关闭导致操作中断。

额外注意事项

  • 确认connectToSQLServer函数是标准的Promise风格实现,否则外层await无法正确等待连接建立。
  • 如果bulkLoad操作数据量较大,建议设置合理的请求超时时间,避免客户端因等待过久触发超时。

内容的提问来源于stack exchange,提问作者Jagdish Padeliya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:43:19