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

Next.js+Supabase插入数据报错:记录无published字段

问题:Supabase插入章节数据时报错"record 'new' has no field 'published'"

错误核心原因

错误提示里的record "new" has no field "published"不是因为代码里传了published字段,而是你的Supabase数据库中chapters表关联的触发器(Trigger)或规则(Rule)在引用一个不存在的published字段。

你之前曾在插入参数中写过published: true,大概率当时为这个字段创建过相关触发器(比如自动更新状态、同步数据的触发器),后来删除了published字段但没同步删除或更新对应的触发器。

复现步骤

  • 登录网站
  • 进入项目页面
  • 点击「上传章节」按钮
  • 填写章节编号和标题
  • 选择文件(PDF、Word文档或图片)
  • 点击「上传章节」按钮
  • 文件成功上传至存储服务
  • 数据库插入操作失败并报错

报错信息

{"code":"42703","message":"record \"new\" has no field \"published\""}

上传代码

const handleSubmit = async (e: React.FormEvent) => {
    e.preventDefault()
    if (!userId || !file) return

    try {
      setUploading(true)

      const fileExt = file.name.split('.').pop()
      const fileName = `${projectId}-ch${chapterNumber}-${Date.now()}.${fileExt}`
      const filePath = `chapters/${fileName}`

      // 上传成功 ✅
      const { error: uploadError } = await supabase.storage
        .from('projects')
        .upload(filePath, file)

      if (uploadError) {
        alert('Upload failed: ' + uploadError.message)
        return
      }

      const { data: urlData } = supabase.storage
        .from('projects')
        .getPublicUrl(filePath)

      // 插入数据库失败 ❌
      const { error: dbError } = await supabase
        .from('chapters')
        .insert({
          project_id: projectId,
          chapter_number: chapterNumber,
          title,
          filename: file.name,
          file_path: filePath,
          file_url: urlData.publicUrl,
          thumbnail_url: thumbnailUrl,
          user_id: userId,
        })

      if (dbError) {
        alert('DB Error: ' + JSON.stringify(dbError))
        return
      }

    } catch (error) {
      console.error('Error:', error)
    } finally {
      setUploading(false)
    }
  }

Chapters表结构

id           uuid
project_id   uuid
chapter_number int4
title        text
filename     text
file_path    text
file_url     text
thumbnail_url text
views        int4
user_id      uuid
created_at   timestamptz
deleted_at   timestamptz
scheduled_for timestamp
status       text

已尝试的解决方法

  • 从插入代码中移除published字段
  • 清除Next.js缓存并重启服务器
  • 强制刷新浏览器

解决步骤

  1. 登录Supabase控制台,进入你的项目
  2. 打开「SQL编辑器」页面
  3. 执行以下SQL查询,找到chapters表关联的所有自定义触发器:
SELECT tgname, tgrelid::regclass, tgfoid::regproc
FROM pg_trigger
WHERE tgrelid = 'chapters'::regclass AND NOT tgisinternal;
  1. 查看查询结果中的触发器名称和关联函数,定位到引用published字段的触发器
  2. 若该触发器已无用处,直接删除:
DROP TRIGGER [触发器名称] ON chapters;
  1. 若需要保留触发器,修改对应的触发器函数,将new.published替换为当前表存在的字段(比如你的status字段):
-- 先查看触发器函数内容
SELECT prosrc FROM pg_proc WHERE proname = '[触发器函数名称]';

-- 修改函数(示例,根据实际逻辑调整)
CREATE OR REPLACE FUNCTION [触发器函数名称]()
RETURNS TRIGGER AS $$
BEGIN
  -- 替换原逻辑中的new.published为new.status
  IF NEW.status = 'published' THEN
    -- 其他业务逻辑
  END IF;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;
  1. 重新执行插入操作,验证问题是否解决

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.03 17:13:11