在TypeScript的Supabase数据库调用中如何将指定浮数字段转为整数返回?
在TypeScript的Supabase数据库调用中如何将指定浮数字段转为整数返回?
我来给你两个靠谱的解决思路,都是在数据库/查询层面处理,绝对不会让原始浮点数出现在网络请求里:
方案一:直接在Supabase查询中使用PostgreSQL内置函数
Supabase底层基于PostgreSQL,它自带了round()和trunc()这类数值处理函数,你可以直接在select语句里指定字段并做处理,替代原来的select "*"。这样数据库返回的就是处理后的整数,原始浮点数根本不会出现在网络请求的响应里。
修改你的fetchPlayers函数如下:
export async function fetchPlayers(): Promise<Player[]> { const { data: { user }, } = await supabase.auth.getUser(); // 明确指定要返回的字段,用round()处理浮点列并保持原字段名 const { data } = await supabase .from(PLAYERS_TABLE) .select(`id, owner_id, name, round(strength) as strength, round(fitness) as fitness`) .eq("owner_id", user!.id); // 如果你需要更严谨的类型定义,可以创建一个新类型(比如PublicPlayer),把strength/fitness定义为整数类型 return data as Player[]; }
- 用
round()会对浮点数做四舍五入,比如3.7会变成4,2.2会变成2; - 要是你想直接截断小数部分(比如3.7直接变成3),就把
round()换成trunc()就行。
方案二:创建数据库函数(适合复用复杂逻辑)
如果之后你需要在多个地方复用这个数值处理逻辑,或者要加更复杂的规则,推荐创建一个PostgreSQL函数,然后通过Supabase的rpc方法调用它。
第一步:在Supabase控制台创建数据库函数
进入Supabase的SQL编辑器,执行以下SQL创建函数:
CREATE OR REPLACE FUNCTION get_players_for_owner(p_owner_id uuid) RETURNS TABLE ( id uuid, owner_id uuid, name text, strength integer, fitness integer ) AS $$ BEGIN RETURN QUERY SELECT id, owner_id, name, round(strength)::integer as strength, round(fitness)::integer as fitness FROM players WHERE owner_id = p_owner_id; END; $$ LANGUAGE plpgsql SECURITY DEFINER;
- 这个函数接收
owner_id作为参数,返回处理后的玩家数据,直接把strength和fitness转成了整数类型; SECURITY DEFINER确保函数执行时使用创建者的权限,避免出现数据访问权限问题,你可以根据自己的需求调整这个设置。
第二步:在前端调用这个数据库函数
修改你的fetchPlayers函数,用supabase.rpc来调用刚才创建的函数:
// 可以先创建一个匹配函数返回结构的类型,让类型检查更严谨 type PublicPlayer = { id: string; owner_id: string; name: string; strength: number; fitness: number; }; export async function fetchPlayers(): Promise<PublicPlayer[]> { const { data: { user }, } = await supabase.auth.getUser(); const { data } = await supabase.rpc("get_players_for_owner", { p_owner_id: user!.id }); return data as PublicPlayer[]; }
不管用哪种方案,最终数据库返回的都是处理后的整数,原始的浮点数绝对不会在网络请求中暴露,完美解决你的问题。
备注:内容来源于stack exchange,提问作者Jan D.M.
相关产品推荐
相关产品推荐

