SvelteKit钩子阻止端点请求



尝试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.logs,但没有消息输出到终端&当我检查应用程序存储时,没有添加新的cookie。

关于钩子我错过了什么?为什么它没有将请求传递给端点?

你知道我该怎么解决这个问题吗?

handle钩子为每个请求运行,包括端点。

当你在没有令牌的情况下获取/api/login时,你的钩子会将请求从isLogin === false重定向到/login。你需要通过允许每个不需要登录就可以访问的路由,例如:

const isLogin = /^/(api/)?login$/.test(event.url.pathname)

最新更新