【问题标题】:How to pass data from endpoint to getSession() in SvelteKit?如何将数据从端点传递到 SvelteKit 中的 getSession()?
【发布时间】:2022-01-25 20:53:12
【问题描述】:

我正在尝试将一个对象从端点传递到getSession,我相信它们都在服务器中运行。我可以得到用 cookie 传递的值,但不能得到用 request.locals.<variable> 传递的值:

src/hooks.ts:

import cookie from 'cookie'

export async function handle({request, resolve}) {
  const cookies = cookie.parse(request.headers.cookie || '')

  request.locals.accessToken = cookies.accessToken
  request.locals.refreshToken = cookies.refreshToken

  const response = await resolve(request)

  const accessToken = `accessToken=${request.locals.accessToken || ''}; Path=/; Secure; HttpOnly;`
  const refreshToken = `refreshToken=${request.locals.refreshToken || ''}; Path=/; Secure; HttpOnly;`

  response.headers['set-cookie'] = [accessToken, refreshToken]
  
  return response
}

export async function getSession(request) {
    console.log('check request local', request.locals)
  return {
    accessToken: request.locals.accessToken,
    refreshToken: request.locals.refreshToken,
    user: request.locals.user
  }
}

我的端点:

export const post: RequestHandler<Locals, FormData> = async(req) => {
    const name = req.body.get("name")
    const password = req.body.get("password")

    if (!name || !password) {
        return {
            status: 400,
            body: {
                message: "Missing username or password"
            }
        }
    }
    const { access_token, refresh_token } = await getAccessToken(name, password)

  req.locals.accessToken = access_token
  req.locals.refreshToken = refresh_token

    const user = await getUser(access_token)

    req.locals.user = user
  
  return {
    status: 302,
    headers: {
      location: '/lobby'
    }
  }
}

如果我想将带有request.locals 的数据传递给getSession,我应该在handle 中运行getUser 吗?

编辑

我实际上能够在const response = await resolve(request) 之后获得request.locals.user 的值,但不能在resolve 之前获得。这是为什么呢?

【问题讨论】:

  • 你解决过这个问题吗?有我自己的问题。我不知道如何将handlegetSession中获得的用户数据获取到我的页面数据中。
  • 是的,我愿意。问题是数据仅通过 cookie 传递。因此,如果您需要,请使用 cookie 传递它。

标签: svelte sveltekit


【解决方案1】:

我将数据从我的端点传递到 getSession,并在 handle 函数中设置了一个 cookie,正如 John 前面提到的:

//  src/hooks.js

import cookie from 'cookie';

export const handle = async ({ event, resolve }) => {
    const cookies = cookie.parse(event.request.headers.get('cookie') || '');
    event.locals.user = cookies.user || null;
    const response = await resolve(event);
    if (event.locals.user) {
        response.headers.set(
            'set-cookie',
            cookie.serialize('user', event.locals.user, {
                path: '/',
                httpOnly: true
            })
        );
    }
    return response;
};

export async function getSession(event) {
    return {
        user: event.locals.user
    }
}

【讨论】:

    【解决方案2】:

    在 hooks.ts 的 handle() 中获取用户信息(const response = await resolve(request) 之前是一个好地方。这是因为如果您要限制对基于页面或端点的访问关于用户是谁(或者可能是用户角色),您希望在调用页面或端点之前发生这种情况。

    关于您的其他问题,即为什么在解决请求后才填充 request.locals.user,这对我来说似乎是一个错误。我可以确认同样的行为。您可能希望将其作为问题提交。

    【讨论】:

      猜你喜欢
      • 2022-12-12
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 2016-06-12
      • 1970-01-01
      相关资源
      最近更新 更多