在 SvelteKit 的表单操作中使用父数据

Rok*_*vis 5 sveltekit

父级的+laytout.server.ts数据可以通过来自 load 函数的 throwparent() 方法获取。(文档中描述

问题:是否可以在表单操作 中访问该数据?

// src/routes/account/+page.server.js

/** @type {import('./$types').PageServerLoad} */
export async function load({parent}) {
  const {IMPORTANT_DATA} = await parent()

  return {
    IMPORTANT_DATA
  };
}
 
/** @type {import('./$types').Actions} */
export const actions = {
  logout: async (event) => {
    // I would like to access IMPORTANT_DATA here
  }
};
Run Code Online (Sandbox Code Playgroud)

小智 -1

为了访问“IMPORTANT_DATA”,在我的例子中是来自操作的会话信息,我在文件 src/hooks.server.js 中设置event.locals.sessioninfo = user;

/** @type {import('@sveltejs/kit').Handle} */
import  jwt  from 'jsonwebtoken';
import User from "$lib/model/user";
import {
  SECRET_SESSION_HASH
} from '$env/static/private';


export async function handle({cookies, event, resolve }) {

  
  // set sesion data
  let user = null;
  try {
    let ckses = event.cookies.get('sessionid');

    const {email} = jwt.verify(ckses,SECRET_SESSION_HASH);
    user =  await User.getByEmail(email);
    delete user.password;
    event.locals.sessioninfo = user;

  } catch (e) {
    console.log("no session");
  }

  const response = await resolve(event);
  return response;
}
Run Code Online (Sandbox Code Playgroud)

然后在+page.server.js中

/** @type {import('./$types').LayoutServerLoad} */
/** @type {import('./$types').Actions} */


import {fail, redirect} from "@sveltejs/kit"
import User from "$lib/model/user";

export async function load({locals}) {
  let {sessioninfo} = locals;
  if (sessioninfo) {
    if (sessioninfo.roles.includes("sudo")) {
      let users =  await  User.gets();
      return {users};
    }
  }
  throw redirect(302, "/cuenta");
}

export const actions = {
  activeaccount: async ({locals, cookies, request}) => {
    let {sessioninfo} = locals;
    if (sessioninfo) {

      if (sessioninfo.roles.includes("sudo")) {
        const formData = await request.formData();
        const id       = formData.get("id");
        const status   = formData.get("status");
        let res = await User.update({status},id);
        return {res};
      }

    }
  },
}
Run Code Online (Sandbox Code Playgroud)