
在 Next.js API 路由中使用回调式 MySQL 查询时,因异步执行未等待数据库操作完成便提前结束函数,导致 Error: No response is returned from route handler。根本解法是统一使用 async/await + Promise 封装,确保响应严格在数据获取后发出。
在 next.js api 路由中使用回调式 mysql 查询时,因异步执行未等待数据库操作完成便提前结束函数,导致 `error: no response is returned from route handler`。根本解法是统一使用 `async/await` + promise 封装,确保响应严格在数据获取后发出。
Next.js 的 API 路由(如 app/api/departments/route.ts 或 pages/api/departments.ts)要求路由处理器必须显式返回一个有效的 Response 对象(如 NextResponse)。而你原始代码中的 db.query(...) 是 Node.js 原生的回调风格(callback-based)异步操作,它不会阻塞执行流——GET 函数在 db.query 被调用后立即结束,并未返回任何响应,因此 Next.js 报出 No response is returned from route handler 错误。
✅ 正确做法:将回调转为 Promise,并配合 async/await 确保响应延迟至数据库操作完成后再发出。
以下是修复后的完整示例(推荐使用 app 目录结构,TypeScript 版本):
// app/api/departments/route.ts
import { NextResponse } from 'next/server';
import db from '@/lib/db'; // 确保导出的是 mysql2/promise 或已封装为 Promise 的连接池
// ✅ 推荐方案:直接使用 mysql2/promise(更简洁、原生支持 await)
export async function GET() {
try {
const [results] = await db.execute('SELECT * FROM department');
return NextResponse.json({ data: results }, { status: 200 });
} catch (error) {
console.error('Database query failed:', error);
return NextResponse.json(
{ error: 'Failed to fetch departments' },
{ status: 500 }
);
}
}⚠️ 若你仍在使用基于回调的 mysql(非 mysql2),则需手动 Promisify(如答案中所示):
// 兼容旧 mysql 模块的写法(不推荐,仅作参考)
export async function GET() {
try {
const results = await new Promise<any[]>((resolve, reject) => {
db.query('SELECT * FROM department', (error, results) => {
if (error) reject(error);
else resolve(results);
});
});
return NextResponse.json({ data: results }, { status: 200 });
} catch (error) {
console.error('MySQL query error:', error);
return NextResponse.json(
{ error: 'Internal Server Error' },
{ status: 500 }
);
}
}? 关键注意事项:
-
永远不要在
GET(或POST等)函数体中仅调用异步方法而不await或return响应; - 避免混合回调与顶层
return—— 回调内的return只退出回调函数,不影响外层路由处理器; - 强烈建议升级至
mysql2并启用promise()接口(createPool(...).promise()),获得原生async/await支持; - 状态码应语义化:查询成功用
200 OK(非201 Created,后者适用于资源创建); - 生产环境务必添加错误日志与用户友好错误消息,避免暴露敏感信息。
通过以上改造,API 路由将严格遵循 Next.js 的响应契约,彻底解决“无响应返回”问题,并提升代码可维护性与健壮性。



















