尝试SvelteKit和我有一个艰难的时间挂钩。医生似乎并没有很好地解释这一切。我目前对hooks的理解是,它们基本上允许您在请求到达目的地之前与服务器进行交互。(我愿意接受更好的解释——特别是handle
钩子)。我现在的问题是我做了一个端点叫login
。顾名思义,它允许用户通过生成令牌并将其作为cookie存储在他们的客户机上,从而登录到我的应用程序。在我添加钩子之前,这是可行的。在阅读了钩子描述之后,我认为handle
钩子非常适合我想要做的事情-验证每个请求上的令牌-如果无效,将用户重新路由到登录屏幕,如果有效,允许请求继续不间断。
export const handle: Handle = async ({ event, resolve }) => {
const isLogin = event.url.pathname.startsWith('/login')
const cookies = cookie.parse(event.request.headers.get('cookie') || '');
const token = cookies['token']
if (!token) {
if (!isLogin) {
return Response.redirect(`${event.url.origin}/login`)
}
return await resolve(event)
} else {
try {
await verifyToken(token)
if (isLogin) {
return Response.redirect(`${event.url.origin}/about`)
}
} catch (err) {
return Response.redirect(`${event.url.origin}/login`)
}
}
return await resolve(event)
};
这没有按预期工作。当我向api/login
端点发起请求时,请求似乎没有到达那里。我在端点上都有console.log
s,但没有消息输出到终端&当我检查应用程序存储时,没有添加新的cookie。
关于钩子我错过了什么?为什么它没有将请求传递给端点?
你知道我该怎么解决这个问题吗?
handle
钩子为每个请求运行,包括端点。
当你在没有令牌的情况下获取/api/login
时,你的钩子会将请求从isLogin === false
重定向到/login
。你需要通过允许每个不需要登录就可以访问的路由,例如:
const isLogin = /^/(api/)?login$/.test(event.url.pathname)