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

API Routes报错:API resolved without sending a response 问题求助

问题分析与解决方案

你遇到的错误核心原因是异步回调的执行时机问题:
fs.readdir是异步IO操作,你的API handler函数在调用完fs.readdir后就直接执行完毕了,但此时回调函数还没触发,Next.js会认为这个请求没有返回任何响应,因此抛出API resolved without sending a response的警告。

第二个方案能"解决"报错只是因为它在handler结束前就直接发送了响应,但完全跳过了fs.readdir的异步逻辑,显然不符合你的需求。


正确的两种解决方案

方案1:使用同步IO方法(简单直接)

改用fs.readdirSync和fs.writeFileSync,让代码阻塞直到文件操作完成,确保响应在handler结束前发送:

import fs from 'fs';

export default function handler(req: NextApiRequest, res: NextApiResponse) {
  try {
    // 同步读取目录,等待操作完成
    const files = fs.readdirSync('./src/data/logs');
    const logNumber = files.length;
    // 同步写入文件
    fs.writeFileSync(`./src/data/logs/log${logNumber}.txt`, req.body);
    // 发送成功响应
    res.status(200).json({ message: `log${logNumber}` });
  } catch (err) {
    // 捕获所有错误,发送错误响应
    res.status(500).json({ message: err });
  }
};

方案2:使用异步Promise + async/await(推荐,非阻塞)

使用Node.js的fs/promises模块,结合async/await让异步代码同步化,避免阻塞事件循环:

// 导入promise版本的fs
import fs from 'fs/promises';

// handler改为async函数
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
  try {
    // await等待目录读取完成
    const files = await fs.readdir('./src/data/logs');
    const logNumber = files.length;
    // await等待文件写入完成
    await fs.writeFile(`./src/data/logs/log${logNumber}.txt`, req.body);
    // 发送成功响应
    res.status(200).json({ message: `log${logNumber}` });
  } catch (err) {
    // 捕获错误并响应
    res.status(500).json({ message: err });
  }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:02:50