通过 SvelteKit 表单操作发送查询参数

问题描述 投票:0回答:1

我使用 SvelteKit 创建了一个网站。我正在使用 form action 来处理登录表单。

src/routes/(beforeAuth)/login/+page.svelte
有登录表格

<form use:enhance method="post" action="/login?/login">

    <label>Username:</lable>
    <input type="text" name="username" />

    <label>Password:</lable>
    <input type="password" name="password" />

    <Button text="Sign In" type="submit" />
<form>

src/routes/(beforeAuth)/login/+page.server.js
有登录操作

export const actions = {
    login: async ({ cookies, request }) => {
        const data = await request.formData();
        let body
            try{
                 body = await api.post("account/login/", {
                    username: data.get('username'),
                    password: data.get('password')
            });
            }catch(err) {
                return {
                    message: "username or password is not vailid",
                    login: false
                }
            }
            
        if (body.status === 401) {
            return fail(401, { tryAgain: true })
        
        }
        if(body.status == 400) {
            return {
                message: body.data.message,
                login: false
            }
        }
        
        if(body.status == 200) {
            const value = btoa(JSON.stringify(body));
            cookies.set('jwt', value, { secure: false, path: '/', maxAge:60 * 60 * 6 });
            redirect(307, '/my-profile')
        
        } else {
            return {
                message: "username or password is not vailid",
                login: false
            }
        }
    },
    logout: async ({ cookies, locals }) => {
        cookies.delete('jwt', {path:'/'});
        locals.user = null;
    },
};

此登录表单和操作运行良好。但现在我想通过表单操作发送查询参数。所以我尝试将操作设置为

/login?/login?redirect=some-path

例如

<form use:enhance method="post" action="/login?/login?redirect=some-path">

这给了我错误

SvelteKitError: No action with name 'login?redirect' found

在 SvelteKit 中通过表单操作发送查询参数的正确方法是什么?

javascript forms svelte query-string sveltekit
1个回答
0
投票

表单/操作文档的重定向小节使用查询字符串参数来执行可选的重定向(这也是您的目标),所以我们知道这是可能的。

由于形式 name 源自特殊的命名法(即通过在查询参数前添加

/
前缀),因此很自然地假设在 URL
/login?/login
中,
?
标记查询字符串的开头,因此额外的
?
将按字面意思理解(因此,您的后端查找名为
login?redirect
的操作时会出现错误)。

我假设正确的格式是

/login?/login&redirect=some-path
,其中
?
标记查询字符串的开头,
/login
是第一个参数(并且因为
/
被解析为操作名称),
&
是一个标准的查询分隔符,并且
redirect=some-path
should 然后被正确解析。

关于正确访问和使用该参数,我再次建议您参考上面的示例(使用

url
访问器和
searchParams
属性)。

© www.soinside.com 2019 - 2024. All rights reserved.