使用await调用Supabase查询时出现SyntaxError错误求助
问题
尝试通过邮箱从Supabase数据库获取用户信息,在app.js中执行console.log(await db.getUserByEmail("email@gmail.com"))时触发语法错误:SyntaxError: missing ) after argument list。Node.js版本为v19.3.0,已排除版本过低问题。
app.js 代码片段
console.log(await db.getUserByEmail("email@gmail.com"))
database.js 完整代码
// Initialize Supabase const { createClient } = require('@supabase/supabase-js') require("dotenv").config({path: "./index.config"}) const supabaseUrl = process.env.SUPABASE_URL const supabaseKey = process.env.SUPABASE_KEY const supabase = createClient(supabaseUrl, supabaseKey) class database { static async fetchUsers() { const {data, error} = await supabase .from("users") .select(); if(error) { console.error(error); } if(data) { console.log(data) } } static async createUser(email, hashedPassword, gender) { const { data, error } = await supabase .from('users') .insert([{ email: email, hashedPassword: hashedPassword, gender: gender },]); if(error) { console.error(error); } } static async emailExists(email) { const {data, error} = await supabase .from("users") .select("email"); if(error) { console.error(error); return true; } if(data) { for (let i = 0; i < data.length; i++) { console.log("["+i+"] " + data[i].email + " : " + "["+i+"] " + email) if(data[i].email == email) { return true; } } return false; } return true; } static async getUserByEmail(email) { const {data, error} = await supabase .from("users") .select(); if(error) { console.error(error); return null } if(data) { data.forEach(user => { if(user.email == email) { console.log(user.email) console.log(email) console.log(user) return user } }) return null } return null } } module.exports = database;
错误堆栈信息
SyntaxError: missing ) after argument list at internalCompileFunction (node:internal/vm:74:18) at wrapSafe (node:internal/modules/cjs/loader:1141:20) at Module._compile (node:internal/modules/cjs/loader:1182:27) at Module._extensions..js (node:internal/modules/cjs/loader:1272:10) at Module.load (node:internal/modules/cjs/loader:1081:32) at Module._load (node:internal/modules/cjs/loader:922:12) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:82:12) at node:internal/main/run_main_module:23:47
解决方案
1. 修复语法错误核心原因
await 只能在async函数或者ES模块顶级作用域中使用。如果app.js是默认的CommonJS模块,顶级作用域不能直接使用await,需要将代码包裹在async函数内:
修改app.js:
// 方式1:定义async函数并调用 async function getUser() { console.log(await db.getUserByEmail("email@gmail.com")); } getUser(); // 方式2:立即执行async函数 (async () => { console.log(await db.getUserByEmail("email@gmail.com")); })();
2. 修复getUserByEmail方法的逻辑问题
当前getUserByEmail存在两个问题:一是forEach中的return无法跳出循环或返回值,导致永远返回null;二是全表查询效率低下。直接用Supabase的过滤条件优化:
修改database.js中的getUserByEmail方法:
static async getUserByEmail(email) { const { data, error } = await supabase .from("users") .select() .eq("email", email) // 直接添加邮箱过滤,只查询目标数据 .single(); // 若邮箱是唯一标识,用single()返回单个对象而非数组 if (error) { console.error(error); return null; } return data; }
3. 优化emailExists方法(可选)
同样,emailExists无需全表查询,直接用过滤条件判断存在性更高效:
static async emailExists(email) { const { count, error } = await supabase .from("users") .select("email", { count: 'exact', head: true }) .eq("email", email); if (error) { console.error(error); return true; } return count > 0; }
内容的提问来源于stack exchange,提问作者marcel
相关产品推荐
相关产品推荐

