前端代码(Redux):
用于获取当前用户数据和登录用户的 Redux 操作。
问题:当我尝试在托管网站上登录或检索当前用户的数据时,无法检索
currentuser
功能的令牌。
这是我的indexController.js
exports.currentUser = catchAsyncErrors(async (req, res, next) => {
const user = await User.findById(req.id).exec()
res.json({ user })
})
exports.signin = catchAsyncErrors(async (req, res, next) => {
const user = await User.findOne({ email: req.body.email }).select("+password").exec()
if (!user)
return next(new ErrorHandler("User not found with this email address", 404))
const isPasswordMatched = await user.comparePassword(req.body.password)
if (!isPasswordMatched)
return next(new ErrorHandler("Wrong Credentials", 401))
sendToken(user, 200, res)
})
这是router.js
router.post('/signin', signin)
router.post('/user', isAuthenticated, currentUser)
sendtoken.js
exports.sendToken = (user, statusCode, res) => {
const token = user.getjwttoken()
const options = {
exipres: new Date(
Date.now() + process.env.COOKIE_EXPIRE * 24 * 60 * 60 * 1000
),
httpOnly: true,
secure:true
}
console.log(token)
res.status(statusCode).cookie("token", token, options)
.json({ success: true, id: user._id,token })
}
Redux 代码
export const asyncCurrentUser = (token) => async (dispatch, getState) => {
try {
const response = await axios.post("/user");
if (response && response.data && response.data.user) {
console.log(response)
dispatch(saveUser(response.data.user));
} else {
console.error('Invalid response format from server:', response.data);
}
return response.data;
} catch (error) {
console.error('Error fetching current user data:', error.response?.data ||error.message);
throw error;
}
};
export const asyncsigninUser = (user) => async (dispatch, getState) => {
try {
const response = await axios.post("/signin", user);
console.log(response.data.token)
if (response.status == 200) {
window.localStorage.setItem("token", response.data.token)
await dispatch(asyncCurrentUser(response.data.token))
}
return response.data;
} catch (error) {
console.log(error.response.data);
throw error;
}
};
关于 Redux 这里我认为你应该在使用
{withCredentials: true}
发出请求时使用 axios
将令牌保存在 cookie 中。
所以就你而言
const response = await axios.post("/user",{withCredentials: true});
// ...do that with other requests
此外,我建议您将其设为
GET
请求,而不是 POST
请求。
router.post('/user', isAuthenticated, currentUser)