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
相关产品推荐
相关产品推荐

