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

使用Sequelize向PostgreSQL表插入数据时Title列值为空的问题

问题排查与解决办法

核心问题拆解

1. Title插入null的原因

  • 冗余key构造导致潜在取值失败:你循环里明明已经拿到了目标key(比如q-11-option-1),却又重新拆分构造optionValueKey去取值。虽然当前请求体里的key格式都对,但如果后续key格式变动或者拆分索引出错,就会导致optionValue变成undefined,最终插入数据库时被转成null触发非空约束。
  • 自定义addOption方法可能参数传递出错:Sequelize模型默认用create()创建数据,如果你自己写的addOption静态方法没正确接收Title参数,就会导致SQL插入语句里缺了Title字段,自然就会报非空错误。

2. TypeError的原因

当抛出的不是Sequelize验证类错误(比如数据库连不上、SQL写错)时,error.errors根本不存在,直接调用forEach就会报错。


具体修复步骤

步骤1:简化取值逻辑,避免冗余操作

直接用遍历到的key取值,同时正确解析QueId:

app.post("/submitOptions", async (request, response) => {
  console.log("Options request body", request.body);
  try {
    // 先过滤出所有选项相关的key
    const optionKeys = Object.keys(request.body).filter(key => key.startsWith("q-"));
    for (const key of optionKeys) {
      const parts = key.split("-");
      const questionIDfromRequestBody = parts[1];
      const optionValue = request.body[key]; // 直接用当前key拿值,不用重新构造
      
      console.log(optionValue);
      // 优先用Sequelize默认的create方法,避免自定义方法出问题
      const option = await QuestionOptions.create({
        Title: optionValue,
        QueId: questionIDfromRequestBody
      });
    }
    return response.redirect(`/addElectors`);
  } catch (error) {
    console.log(error);
    // 先判断error.errors是否存在,再遍历
    if (error.errors) {
      error.errors.forEach(element => {
        request.flash("error", element.message);
      });
    } else {
      request.flash("error", error.message || "提交选项失败,请重试");
    }
    response.redirect("/addOptions");
  }
});

步骤2:检查自定义addOption方法(如果必须用)

如果你一定要用addOption,确保它正确把参数传给create:

// 在QuestionOptions模型文件里定义静态方法
QuestionOptions.addOption = async function(optionData) {
  return await this.create({
    Title: optionData.Title,
    QueId: optionData.QueId
  });
};

步骤3:确认数据库表结构

手动检查QuestionOptions表的Title列是否真的设置了非空约束:

-- 执行这条SQL查看表结构
SELECT column_name, is_nullable FROM information_schema.columns WHERE table_name = 'QuestionOptions';

如果is_nullable显示YES,执行下面的SQL修改:

ALTER TABLE QuestionOptions ALTER COLUMN Title SET NOT NULL;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:07:35