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缓存并重启服务器
- 强制刷新浏览器
解决步骤
- 登录Supabase控制台,进入你的项目
- 打开「SQL编辑器」页面
- 执行以下SQL查询,找到
chapters表关联的所有自定义触发器:
SELECT tgname, tgrelid::regclass, tgfoid::regproc FROM pg_trigger WHERE tgrelid = 'chapters'::regclass AND NOT tgisinternal;
- 查看查询结果中的触发器名称和关联函数,定位到引用
published字段的触发器 - 若该触发器已无用处,直接删除:
DROP TRIGGER [触发器名称] ON chapters;
- 若需要保留触发器,修改对应的触发器函数,将
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;
- 重新执行插入操作,验证问题是否解决
内容的提问来源于stack exchange,提问作者Sami Uddin
相关产品推荐
相关产品推荐

