TanStack Router useSearch获取Passport.js谷歌认证Google ID异常求助
解决TanStack Router获取Google ID时的精度丢失问题
你的判断完全正确:Google ID的数值超过了JavaScript Number 类型的安全整数范围(2^53 - 1),TanStack Router默认会将数字型的搜索参数自动转换为Number,导致精度丢失。以下是几种可靠的解决方法:
方法一:通过路由搜索参数Schema指定类型(推荐)
如果使用TanStack Router v10及以上版本,可以在路由定义时配置searchSchema,明确将googleId指定为字符串类型,避免自动转换。
使用Zod Schema(官方推荐方式)
import { z } from 'zod'; import { createFileRoute } from '@tanstack/react-router'; export const Route = createFileRoute('/signup/addOtherInfo')({ searchSchema: z.object({ email: z.string(), googleId: z.string(), // 强制解析为字符串 }), });
之后在组件中正常使用useSearch()即可,此时googleId会保持原始字符串值:
const { email, googleId } = Route.useSearch();
自定义解析函数
如果不使用Zod,也可以通过searchParser手动解析搜索参数:
import { createFileRoute } from '@tanstack/react-router'; export const Route = createFileRoute('/signup/addOtherInfo')({ searchParser: (searchParams) => ({ email: searchParams.get('email') || '', googleId: searchParams.get('googleId') || '', // 直接获取原始字符串 }), });
方法二:手动使用URLSearchParams获取
绕过TanStack Router的自动解析逻辑,直接从浏览器URL中提取原始字符串参数:
const searchParams = new URLSearchParams(window.location.search); const email = searchParams.get('email'); const googleId = searchParams.get('googleId'); // 得到完整的原始Google ID字符串
方法三:后端传递时优化(辅助措施)
虽然前端处理是核心,但后端重定向时可以确保googleId以字符串形式传递(URL参数本身就是字符串,此步骤主要是避免后端输出时的隐式转换):
return res.redirect(`${process.env.FRONTEND_URL}/signup/addOtherInfo?email=${encodeURIComponent(user.email)}&googleId=${String(user.googleId)}`);
注意使用encodeURIComponent处理特殊字符(比如邮箱中的@),避免URL解析错误。
内容的提问来源于stack exchange,提问作者Samiul Karim
相关产品推荐
相关产品推荐

