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

Supabase中PLV8数据库函数日志查看与调试方法咨询

在Supabase中查看PLV8函数日志及调试方案

查看PLV8.elog输出的方法

  • 调整日志级别
    Supabase默认不记录INFO级日志,需先修改PostgreSQL日志级别:
    会话级临时生效:

    SET log_min_messages = info;
    

    全局永久生效(需管理员权限):

    ALTER SYSTEM SET log_min_messages = info;
    

    执行后重启数据库会话即可生效。

  • 查看日志位置
    在Supabase控制台进入目标项目,点击左侧「数据库」→「日志」,在筛选器中选择「INFO」级别,就能看到plv8.elog(INFO, ...)的输出内容。

  • 临时调试技巧
    如果暂时无法调整日志级别,可将日志级别改为WARNING/ERROR(这类日志默认会被捕获),同时把JSON对象转为字符串避免格式异常:

    plv8.elog(WARNING, JSON.stringify(request_data));
    

针对当前报错的排查

你遇到的Cannot read properties of undefined (reading 'id')错误,说明代码中request_data.user为undefined,大概率是传入的JSON参数缺少user字段,或JSON格式不符合预期。通过上述日志方法打印完整request_data即可快速定位问题。

你的PLV8函数代码

-- FUNCTION: public.handle_onboard_user(json)

-- DROP FUNCTION IF EXISTS public.handle_onboard_user(json);

CREATE OR REPLACE FUNCTION public.handle_onboard_user(
    request_data json)
    RETURNS void
    LANGUAGE 'plv8'
    COST 100
    VOLATILE PARALLEL UNSAFE
AS $BODY$
try {
  plv8.elog(INFO, request_data);
  // --Extract JSON params
  var user = request_data.user; 
  var selected_skills = request_data.selected_skills;
  var selected_categories = request_data.selected_categories;
  var experiences = request_data.experiences;
  var accomplishments = request_data.accomplishments;

  var auth_user_id = user.id;

  // --Update user data onboarding
  plv8.execute('UPDATE public.users SET first_name = $1, last_name = $2, title = $3, resume = $4, degree_programme_id = $5, avatar = $6, about = $7 ,is_onboarded = true, updated_at = now() WHERE id = $8', user.first_name, user.last_name, user.title, user.resume, user.degree_programme_id, user.avatar, user.about, auth_user_id);
  plv8.elog(INFO, 'Update user info successful');

  // -- Select preference of specific user
  var result = plv8.execute('SELECT * FROM public.preferences WHERE user_id = $1', auth_user_id);

  var preference_id = result[0].id;

  // --Update skills
  for (var i = 0; i < selected_skills.length; i++) {
    var skill = selected_skills[i];

    plv8.execute('INSERT INTO public.selected_skills (emsi_id, name) VALUES ($1, $2) ON CONFLICT (emsi_id) DO NOTHING', skill.emsi_id, skill.name);

    var result = plv8.execute('SELECT id FROM public.selected_skills WHERE emsi_id = $1 LIMIT 1', skill.emsi_id);

    if (result.length == 0) {
      continue;
    }

    var skill_id = result[0].id;

    plv8.execute('INSERT INTO public.skills_preferences ' +
  '(selected_skill_id, preference_id) VALUES ($1, $2)', skill_id, preference_id);
  }
  plv8.elog(INFO, 'Insert skills successful');

  // --Insert user selected categories
  for (var i = 0; i < selected_categories.length; i++) {
    var category = selected_categories[i];

    plv8.execute('INSERT INTO public.categories_preferences (category_id, preference_id) VALUES ($1, $2)', category.id, preference_id);
  }
  plv8.elog(INFO, 'Insert selected categories successful');

  // --Insert experiences of user
  for (var i = 0; i < experiences.length; i++) {
    var experience = experiences[i];

    plv8.execute('INSERT INTO public.experiences (title, company_name, is_current, start_date, end_date, description, user_id) VALUES ($1, $2, $3, $4, $5, $6, $7)', experience.title, experience.company_name, experience.is_current, experience.start_date, experience.end_date, experience.description, auth_user_id);
  }
  plv8.elog(INFO, 'Insert user experiences success');

  // --Insert accomplishments of user
  for (var i = 0; i < accomplishments.length; i++) {
    var accomplishment = accomplishments[i];

    plv8.execute('INSERT INTO public.accomplishments (title, issuer, is_active, start_date, end_date, description, user_id) VALUES ($1, $2, $3, $4, $5, $6, $7)', accomplishment.title, accomplishment.issuer, accomplishment.is_active, accomplishment.start_date, accomplishment.end_date, accomplishment.description, auth_user_id);
  }
  plv8.elog(INFO, 'Insert user accomplishments success');

  return;

} catch (error) {

  plv8.elog(ERROR, error.message);

}
$BODY$;

ALTER FUNCTION public.handle_onboard_user(json)
    OWNER TO postgres;

GRANT EXECUTE ON FUNCTION public.handle_onboard_user(json) TO PUBLIC;

GRANT EXECUTE ON FUNCTION public.handle_onboard_user(json) TO anon;

GRANT EXECUTE ON FUNCTION public.handle_onboard_user(json) TO authenticated;

GRANT EXECUTE ON FUNCTION public.handle_onboard_user(json) TO postgres;

GRANT EXECUTE ON FUNCTION public.handle_onboard_user(json) TO service_role;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 14:53:16