使用 react 和 redux 在 axios 的 get 请求中获取状态码 304
Getting status code 304 on a get request with axios using react and redux
我的 Redux Async Thunk
中有一个 get
请求。在调用 get
到我的 node.js 快速服务器后,它发送了一个 304
状态代码,由于某种原因我无法获取我的数据。
const userTokenAxios = axios.create({
baseURL: '/api/shoes',
headers: {
Authorization: `Bearer ${localStorage.getItem('token')}`,
},
});
userTokenAxios.interceptors.response.use((response) => {
if (response.data.errorMessage === 'jwt expired') {
localStorage.removeItem('token');
localStorage.removeItem('user');
}
});
export const getShoesAsync = createAsyncThunk(
'shoes/getShoesAsync',
async (payload, { rejectWithValue }) => {
try {
const response = await userTokenAxios.get('/');
console.log(response);
return response.data;
} catch (error) {
return rejectWithValue(error.response.data);
}
}
);
正在从我的主页调用它:
useEffect(() => {
dispatch(getShoesAsync());
}, [dispatch]);
但是我无法获取任何数据,因为每次页面加载时服务器都会发送 304
我的后端控制器:
exports.getAllShoes = async (req, res, next) => {
try {
let query = Shoe.find({});
const shoes = await query.populate([
{
path: 'user',
select: 'username',
},
]);
return res.status(200).json(shoes);
} catch (err) {
return next(err);
}
};
app.js 在我的后端文件夹中:
// ROUTES
app.use('/auth', authRouter);
app.use(
'/api',
expressJwt({ secret: process.env.JWT_SECRET, algorithms: ['HS256'] })
);
app.use('/api/shoes', shoeRouter);
package.json 在我的 client
文件夹中
"proxy": "http://localhost:9000"
我的网络预览:
问题出在你的拦截器上。响应拦截器 必须 return 一个值,一个被拒绝的 promise 或抛出一个错误,否则生成的 promise 将以 undefined
.
解析
您在成功响应拦截器中拦截令牌错误似乎也很奇怪。我会假设你会使用错误拦截器。
userTokenAxios.interceptors.response.use(
res => res, // success response interceptor
err => {
// usually you'd look for a 401 status ¯\_(ツ)_/¯
if (err.response?.data?.errorMessage === "jwt expired") {
localStorage.removeItem('token');
localStorage.removeItem('user');
}
return Promise.reject(err);
}
);
如果您实际上以 200 状态响应令牌错误,则需要在成功拦截器中处理它
userTokenAxios.interceptors.response.use(
res => {
if (res.data.errorMessage === "jwt expired") {
localStorage.removeItem('token');
localStorage.removeItem('user');
// Make this look like an Axios error
return Promise.reject({
message: "jwt expired",
response: res,
});
}
return res;
}
);
您的请求中似乎也不需要结尾的 forward-slash,因此只需使用
const response = await userTokenAxios.get("");
我的 Redux Async Thunk
中有一个 get
请求。在调用 get
到我的 node.js 快速服务器后,它发送了一个 304
状态代码,由于某种原因我无法获取我的数据。
const userTokenAxios = axios.create({
baseURL: '/api/shoes',
headers: {
Authorization: `Bearer ${localStorage.getItem('token')}`,
},
});
userTokenAxios.interceptors.response.use((response) => {
if (response.data.errorMessage === 'jwt expired') {
localStorage.removeItem('token');
localStorage.removeItem('user');
}
});
export const getShoesAsync = createAsyncThunk(
'shoes/getShoesAsync',
async (payload, { rejectWithValue }) => {
try {
const response = await userTokenAxios.get('/');
console.log(response);
return response.data;
} catch (error) {
return rejectWithValue(error.response.data);
}
}
);
正在从我的主页调用它:
useEffect(() => {
dispatch(getShoesAsync());
}, [dispatch]);
但是我无法获取任何数据,因为每次页面加载时服务器都会发送 304
我的后端控制器:
exports.getAllShoes = async (req, res, next) => {
try {
let query = Shoe.find({});
const shoes = await query.populate([
{
path: 'user',
select: 'username',
},
]);
return res.status(200).json(shoes);
} catch (err) {
return next(err);
}
};
app.js 在我的后端文件夹中:
// ROUTES
app.use('/auth', authRouter);
app.use(
'/api',
expressJwt({ secret: process.env.JWT_SECRET, algorithms: ['HS256'] })
);
app.use('/api/shoes', shoeRouter);
package.json 在我的 client
文件夹中
"proxy": "http://localhost:9000"
我的网络预览:
问题出在你的拦截器上。响应拦截器 必须 return 一个值,一个被拒绝的 promise 或抛出一个错误,否则生成的 promise 将以 undefined
.
您在成功响应拦截器中拦截令牌错误似乎也很奇怪。我会假设你会使用错误拦截器。
userTokenAxios.interceptors.response.use(
res => res, // success response interceptor
err => {
// usually you'd look for a 401 status ¯\_(ツ)_/¯
if (err.response?.data?.errorMessage === "jwt expired") {
localStorage.removeItem('token');
localStorage.removeItem('user');
}
return Promise.reject(err);
}
);
如果您实际上以 200 状态响应令牌错误,则需要在成功拦截器中处理它
userTokenAxios.interceptors.response.use(
res => {
if (res.data.errorMessage === "jwt expired") {
localStorage.removeItem('token');
localStorage.removeItem('user');
// Make this look like an Axios error
return Promise.reject({
message: "jwt expired",
response: res,
});
}
return res;
}
);
您的请求中似乎也不需要结尾的 forward-slash,因此只需使用
const response = await userTokenAxios.get("");