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

Next.js使用multer与next-connect上传文件时,控制台出现未响应报错求助

解决Next.js中multer+next-connect文件上传的"API resolved without sending a response"警告

问题根源分析

  1. 数据库连接错误处理无效:原代码中db().catch()直接调用res,但此时res尚未初始化(代码在路由上下文之外执行),导致数据库连接错误无法正确响应,请求处于未完成状态。
  2. multer文件过滤错误处理违规:fileFilter里直接用res.status().json()传递给cb不符合multer规范,应该传递Error对象,否则会提前发送响应,引发后续响应逻辑混乱。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:15:17