0

Any database operation I perform inside an edge function is not working as expected. For example, if I insert a record, it will not persist to the database or if I select, it returns 0 records. I don't know what I'm missing. Following code is an insertion operation, it does not throw any error and changes are not persisted to the database.

Note: Things work as expected in local environment.


import Joi from "npm:joi";
import { createClient } from 'https://esm.sh/@supabase/supabase-js@2';

Deno.serve(async (req) => {
  let form;
  form  = await req.json();
  const validator = Joi.object({
    name: Joi.string().required(),
    email: Joi.string().required().email(),
    company: Joi.string(),
    message: Joi.string().required().min(128).max(1024),
  });

  try {
    const validation = validator.validate(form);
    if (validation.error) {
      throw ({ msg: validation.error?.toString()?.replace("ValidationError: ", "") });
    }

    const supabase = createClient(
      Deno.env.get("SUPABASE_URL"),
      Deno.env.get("SUPABASE_ANON_KEY"),
      {
        global: {
          headers: {
            Authorization: `Bearer ${req.headers.get('Authorization')!}`,
          },
        }
      }
    );

    await supabase.from("query").insert({
      name: form?.name,
      email: form?.email,
      company: form?.company,
      message: form?.message
    });

    return new Response(
      JSON.stringify({
        success: true
      }),
      {
        headers: { "Content-Type": "application/json" }
      }
    );
  } catch (error) {
    return new Response(
      JSON.stringify({
        name: form?.name || '',
        email: form?.email || '',
        company: form?.company || '',
        message: form?.message || '',
        error: error?.msg || 'Something went wrong!'
      }),

      { status: error?.msg ? 400 : 500, headers: { "Content-Type": "application/json" } },
    );
  }
});

1 Answer 1

1

Actually, I wasn't capturing error from return value and was expecting that promise will through error. So actually error was related to RLS and captured using returned value.

const { error } = await supabase.from("query").insert({
  name: form?.name,
  email: form?.email,
  company: form?.company,
  message: form?.message
});

if (error) {
  console.error(error); // or throw error
}

Error was:

{
  code: "42501",
  details: null,
  hint: null,
  message: 'new row violates row-level security policy for table "query"'
}

I managed to fix it by creating and RLS policy that allows user connecting to supabase to insert a new row on query table.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.