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

在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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 19:03:14