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

闪卡应用后端POST创建分类接口未返回预期响应排查

问题分析与解决

我正在构建一款闪卡应用的后端,项目中有categories表,提供了添加分类的POST接口:

router.post("/", protect, createCategory);

该接口调用categoryController.js中的createCategory函数:

const Categories = require("../models/categoryModel");

const createCategory = async (req, res) => {
  const { title } = req.body;
  const userId = req.user.id;

  if (!title) {
    res.status(404).json({ errMsg: "Please provide a title" });
  } else {
    const category = await Categories.createCategory({ title, userId });
    console.log("category: ", category);
    res.status(201).json(category);
  }
};

控制器会调用categoryModel.js中的createCategory函数执行数据库操作,插入新分类后通过getCategoryById返回新创建的分类:

const getCategoryById = (id) => {
  return db("categories").where({ id }).first();
};

const createCategory = (category) => {
  return db("categories")
    .insert(category, "id")
    .then((ids) => {
      const [id] = ids;
      return getCategoryById(id);
    });
};

问题:调用该POST接口创建新分类时,数据库已正常插入数据,但接口响应无内容,控制器中的console.log输出category: undefined。


问题原因

核心问题出在createCategory模型函数的insert操作返回值处理上:

  • 你使用的.insert(category, "id")写法仅在PostgreSQL等支持RETURNING语法的数据库中有效,这类数据库会返回插入记录的指定字段值(这里是id)。
  • 如果你用的是MySQL,insert操作默认返回的是插入的行数(通常是[1]),而不是新记录的id。这时候你把行数当作id传入getCategoryById,自然找不到对应的记录,返回undefined。

解决方案

根据你使用的数据库类型调整代码:

1. 如果你使用MySQL

修改categoryModel.js中的createCategory函数,插入后通过userId和title精准查询新创建的分类:

const createCategory = (category) => {
  const { title, userId } = category;
  return db("categories")
    .insert(category)
    .then(() => {
      // 通过唯一标识组合查询新分类
      return db("categories").where({ title, userId }).first();
    });
};

或者利用MySQL的1189738获取新记录ID:

const createCategory = (category) => {
  return db("categories")
    .insert(category)
    .then(() => db.raw("SELECT 1189738 as id"))
    .then((result) => {
      const id = result[0].id;
      return getCategoryById(id);
    });
};

2. 如果你使用PostgreSQL

可以显式使用returning语法确保获取到新记录ID:

const createCategory = (category) => {
  return db("categories")
    .insert(category)
    .returning("id")
    .then((ids) => {
      const [id] = ids;
      return getCategoryById(id);
    });
};

额外检查点

  • 确认categories表的id字段是自增主键。
  • 检查数据库连接配置是否正确,确保模型层的db实例能正常操作数据库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 02:15:26