作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个包含以下操作的登录表单 (login/+page.server.js
):
export const actions = {
default: async ({ request, cookies }) => {
const data = Object.fromEntries(await request.formData());
// validate and create DTO.
const loginData = loginDTO(data);
// if errors returned from building the DTO (validation errors) then return the object.
if (loginData?.errors && !emptyObject(loginData.errors)) {
return {
"data": loginData.data,
"errors": loginData.errors,
};
}
// perform call to log in a user.
const response = await login(loginData);
// const response = await loginUser(loginData);
if (response.success) {
// save token to a cookie
cookies.set(
'token',
response.res.data.data,
{
path: '/',
maxAge: 60 * 60 * 25 * 365,
httpOnly: false,
secure: false,
}
)
throw redirect(302, '/')
}
return {
"data": loginData.data,
"errors": response.errors,
}
}
}
基本上,这是向后端发出请求,对用户进行身份验证,并返回 JWT token 。到目前为止一切顺利, token 已返回,并且使用 Sveltekit 的 cookies
我可以成功设置 cookie,当我检查 Chrome 的应用程序选项卡(在开发工具中)时,我可以在那里看到 cookie。
现在,我需要将 cookie 的值附加到我的请求中。我正在使用 axios。为此,我创建了一个拦截器:
import axios from "axios";
import Cookies from "js-cookie";
// let Cookies2 = Cookies.noConflict();
export const app = axios.create({
baseURL: "http://127.0.0.1:8080/api/v1",
timeout: 1000,
params: {},
// withCredentials: true,
})
// Request interceptor. Whenever a new request goes out it will be caught
// by the interceptor and whatever code is defined will be executed before continuing its flow.
app.interceptors.request.use(
config => {
console.log("here in http middleware...")
let token = Cookies.get()
console.log("token: ", token);
config.headers['Content-Type'] = 'application/json';
return config;
},
error => {
Promise.reject(error)
}
);
但我有几个问题:
cookies
对象,不知道如何在此处导入它。log
语句始终是返回空,这意味着它没有拾取 cookie。知道发生了什么吗?或者任何其他方式可以实现我想要做的事情?
我也可以放弃整个 cookie 方法,只使用 store
,每种方法的优缺点是什么?
谢谢。
最佳答案
如果您只需拥有 baseURL 并附加 JWT,我建议您坚持使用 native fetch由 SvelteKit 提供,因为它提供了比普通工具更多的功能 fetch API .
要在 Svelte 中创建等效的“拦截器”,您可以使用 Hook ,更具体地说,handleFetch钩子(Hook)。
其工作原理如下:
以下是 TypeScript 中的示例代码:
// src/hooks.server.ts
import type { HandleFetch } from '@sveltejs/kit';
export const handleFetch = (async ({ request, fetch, event: { cookies } }) => {
if (request.url.startsWith(API_URL)) {
request.headers.set('Authorization', `Bearer ${cookies.get('token')}`);
}
return fetch(request);
}) satisfies HandleFetch;
如果您想要拥有基本URL之类的东西,您可以通过创建新请求来修改request.url。
import type { HandleFetch } from '@sveltejs/kit';
export const handleFetch = (async ({ request, fetch }) => {
const newRequest = new Request('myBaseUrl' + request.url, request);
return fetch(newRequest);
}) satisfies HandleFetch;
关于javascript - 如何从 axios 拦截器访问通过 Sveltkit cookie 创建的 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76087155/
我是一名优秀的程序员,十分优秀!