Next.js使用multer与next-connect上传文件时,控制台出现未响应报错求助
解决Next.js中multer+next-connect文件上传的"API resolved without sending a response"警告
问题根源分析
- 数据库连接错误处理无效:原代码中
db().catch()直接调用res,但此时res尚未初始化(代码在路由上下文之外执行),导致数据库连接错误无法正确响应,请求处于未完成状态。 - multer文件过滤错误处理违规:
fileFilter里直接用res.status().json()传递给cb不符合multer规范,应该传递Error对象,否则会提前发送响应,引发后续响应逻辑混乱。 - Promise处理不规范:混合使用
await和.then()导致Promise链处理不清晰,增加未响应风险。
修复后的完整代码
import db from "@/backend/config/db"; import Categories from "@/backend/model/category"; import { createRouter } from "next-connect"; import multer from "multer"; export const config = { api: { bodyParser: false, // 禁用默认body解析,以流形式处理文件 }, }; const router = createRouter(); const options = multer({ storage: multer.diskStorage({ destination: "./public/assets/images/categories", filename: function (req, file, cb) { cb(null, file.originalname); }, }), fileFilter: (req, file, cb) => { if (file.mimetype.match(/\/(jpg|jpeg|png)$/)) { cb(null, true); } else { // 传递Error对象,由next-connect的onError统一处理 cb(new Error("不支持的图片类型")); } }, }); const uploadCategoryImage = options.single("image"); router.use(uploadCategoryImage).post(async (req, res) => { try { // 在请求上下文内初始化数据库连接 await db(); // 统一使用await写法,避免混合then const data = await Categories.create({ ...req.body, image: req.file.filename }); res.status(200).json({ code: 200, status: "Success!", message: "分类创建成功", data: data, }); } catch (error) { // 捕获数据库或数据创建错误,返回明确响应 res.status(405).json({ error: "数据库连接或数据创建失败: " + error.message }); } }); export default router.handler({ onError(error, req, res) { res .status(400) .json({ error: `请求出错: ${error.message}` }); }, onNoMatch(req, res) { res.status(405).json({ error: `不允许使用'${req.method}'方法` }); }, });
关键修改说明
- 将数据库连接
db()移至POST路由处理函数内,确保在请求上下文里处理连接错误,避免使用未定义的res。 - 调整
fileFilter错误处理:向cb传递Error对象,由next-connect的onError统一响应,避免提前发送响应导致请求状态混乱。 - 统一使用
await替代await+.then()混合写法,让Promise链更清晰,确保所有路径都有明确响应返回。 - 为POST路由添加
try/catch块,捕获数据库操作或数据创建时的错误,确保错误场景下也能返回合法响应。
内容的提问来源于stack exchange,提问作者Muhammad Tayyab
相关产品推荐
相关产品推荐

