Supabase:如何通过电子邮件查询用户?

Nik*_*her 6 postgresql node.js supabase

我在 Node JS 中间件中使用 Supabase。我正在开发一个邀请功能,该功能通过 REST 端点接收现有 supabase 用户的电子邮件地址。现在它应该查询用户表以获得用户 ID。但这似乎不起作用:

(我使用 Supabase JavaScript 库和绕过行级安全性的管理密钥):

const { createClient,   } = require('@supabase/supabase-js')
const supabase = createClient(process.env.SUPABASE_URL, process.env.SUPABASE_KEY)
supabase
  .from('users')
  .select('id')
  .eq('email', 'doe@example.com')
  .then(response => {
    console.log(response)
  })
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

'关系“public.users”不存在'

我也尝试过查询

supabase
  .from('users')
  .select('id')
  .eq('email', 'doe@example.com')
  .then(response => {
    console.log(response)
  })
Run Code Online (Sandbox Code Playgroud)

但这也失败了。貌似无法查询users表。

我究竟做错了什么?如何通过给定的电子邮件查询用户 ID?

有人能把我推向正确的方向吗?

谢谢,

尼科

Nik*_*her 10

自己找到了解决办法:

您无法直接查询 auth.users 表。相反,您必须使用稍后要使用的数据创建一个副本(例如 public.users 或 public.profile 等)。

您可以使用用户触发器,在创建用户后立即自动创建 public.users 表的条目。

我在博客文章中写下了一些代码示例和详细信息:Supabase:如何查询用户表?


小智 9

只是为未来的用户回答:

实现这一点的最佳方法是通过 rpc 函数。

在 supabase 仪表板上,使用以下代码创建一个新查询:

CREATE OR REPLACE FUNCTION get_user_id_by_email(email TEXT)
RETURNS TABLE (id uuid)
SECURITY definer
AS $$
BEGIN
  RETURN QUERY SELECT au.id FROM auth.users au WHERE au.email = $1;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

现在您可以使用以下函数在代码上调用此 rpc 函数。(我使用的是supabase-js v2)

  const { data, error } = await supabaseAdmin.rpc(
   "get_user_id_by_email",
    {
      email: "foo@bar.com",
    }
 );
Run Code Online (Sandbox Code Playgroud)

请注意,我使用 supabaseAdmin 进行此调用,因为我在服务器端。