如何用Formik使用Next.js router.push到动态api路由,得到404(未找到)错误
我正在使用auth0库处理next.js应用程序的注册和身份验证。我还使用它来处理输入数据和验证。我希望通过Formik将电子邮件地址提交到Next.js api路由 当我使用Nextjs的如何用Formik使用Next.js router.push到动态api路由,得到404(未找到)错误,next.js,formik,dynamic-routing,Next.js,Formik,Dynamic Routing,我正在使用auth0库处理next.js应用程序的注册和身份验证。我还使用它来处理输入数据和验证。我希望通过Formik将电子邮件地址提交到Next.js api路由 当我使用Nextjs的useRouterhook通过router导航时。将推送到api路由,它会按预期工作,因此我的数据会传递到api路由,Nextjs-auth0会按预期重定向用户。但是,在重定向浏览器控制台之前,会闪烁以下错误: 我应该忽略这个错误吗?有没有可能,router.push只用于客户端重定向?我正在尝试导航到一个
useRouter
hook通过router导航时。将推送到api路由,它会按预期工作,因此我的数据会传递到api路由,Nextjs-auth0会按预期重定向用户。但是,在重定向浏览器控制台之前,会闪烁以下错误:
我应该忽略这个错误吗?有没有可能,router.push
只用于客户端重定向?我正在尝试导航到一个api路由,这不是应该怎么做的?注意,我的/signup
api路由使用auth0 nextjs代码并将用户重定向到auth0的身份验证页面。相关代码如下
注册api路由:
import auth0 from "../../../lib/auth0"
export default async function signup(req, res) {
const {
query: { pid },
} = req
try {
await auth0.handleLogin(req, res, {
authParams: {
initialScreen: "signup",
login_hint: pid
},
})
} catch (error) {
console.error(error)
res.status(error.status || 500).end(error.message)
}
}
用户外部钩子的导入:
import { useRouter } from 'next/router'
Formik的验证功能:
function validateEmail(value) {
let error;
let re = /\S+@\S+\.\S+/
if (!value) {
error = "Email is required"
} else if (!re.test(value)) {
error = "Please use a valid email"
}
return error
}
Formik submit的处理函数:
const handleFormikSubmit = async (values, actions) => {
router.push('/api/signup/[...pid]', `/api/signup/${values.email}`)
actions.setSubmitting(false)
}
Formik组件(注意,使用(
{({field,form})=>(
{form.errors.email}
)}
以1美元的价格注册开始
)}
下一个/router
尽可能用于本地页面之间的客户端转换。API路由始终在服务器端执行,因此您无法对其执行客户端导航
也就是说,next/router
在您想要重定向到API路由或其他网站时是没有用的
相反,您可以使用window.location.replace()
将用户重定向到API路由。动态路由的用法是。它可以像下面这样使用。第一个看起来更好
import Router from 'next/router'
...
Router.push('/post/[pid]', '/post/abc')
⠀⠀或
import { useRouter } from 'next/router'
...
const router = useRouter()
...
router.push('/post/[pid]', '/post/abc')
这似乎起作用了,现在404错误消失了。我将以下路由器替换为:window.location.replace(/api/signup/${values.email}
),现在使用window.location.replace(/api/signup/${values.email}
)方法,在auth0登录页面上,我必须按两次后退按钮才能返回到服务器上的应用程序。之前只有一次。你知道如何只需单击一下就立即返回到我的应用程序吗?谢谢你的回答!@RancheroBeans,我不确定,但可以尝试window.location.href=/api/signup/${values.email}
相反,你是对的,这很好。我现在可以使用一次反按返回到我的应用程序。一个轻微的澄清是,我必须在backticks中包含/api/signup/${values.email}部分。我将尝试在这里编写,但不确定格式是否会出错:window.location.href=
/api/signup/${values.email}``是的,格式被弄乱了,所以我将用[backtick]来表示backtick:window.location.href=[backtick]/api/signup/${values.email}[backtick]
import { useRouter } from 'next/router'
...
const router = useRouter()
...
router.push('/post/[pid]', '/post/abc')