SvelteKit Hook 阻止端点请求

SvelteKit Hook Prevents Endpoint Request

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

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

知道如何解决这个问题吗?

handle 挂钩针对每个 请求运行——包括端点。

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

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