我正在尝试使用axios npm包访问登录api这是我的api urlhttp://127.0.0.1:3000/api/v1/users/login'
javascript代码
const login = async (email, password) => {
console.log(email, password);
try {
const res = await axios({
method: 'POST',
url: 'http://127.0.0.1:3000/api/v1/users/login',
data: {
email, password
},
});
console.log(res);
} catch (err) {
console.log(err.response.data.message);
}
};
当我们在邮递员中使用api时,cookie已经保存并显示,但当我使用axios使用此api时,浏览器中没有保存。
登录api代码
使用jwt创建令牌
const signToken = (id) => {
return jwt.sign({ id }, process.env.JWT_SECRET, {
expiresIn: process.env.JWT_EXPIRE_IN,
});
};
使用res.cookie
创建登录令牌并设置cookie
const createSignToken = (user, statusCode, res) => {
const token = signToken(user._id);
const cookieOption = {
expires: new Date(Date.now() + process.env.JWT_COOKIE_EXPIRE_IN*24*60*60*1000),
httpOnly: true
}
if (process.env.NODE_ENV === 'production') cookieOption.secure = true;
res.cookie('jwt',token, cookieOption);
//remove password from the output
user.password = undefined;
res.status(statusCode).json({
status: 'success',
token,
data: {
user,
},
});
};
exports.login = catchAsync(async (req, res, next) => {
const { email, password } = req.body;
//if email and password exits
if (!email || !password) {
return next(new AppError('please provide email and password', 400));
}
//check if user exit and password correct
// const user=User.find({email:email})
const user = await User.findOne({ email }).select('+password');
if (!user || !(await user.correctPassword(password, user.password))) {
return next(new AppError('email or password wrong', 401));
}
//if everything ok send token to client
createSignToken(user, 200, res);
});
我建议添加axioswithCredentials: true
选项,以便它始终发送cookie。
const login = async (email, password) => {
console.log(email, password);
try {
const res = await axios({
withCredentials: true, // <=== Add this
method: 'POST',
url: 'http://127.0.0.1:3000/api/v1/users/login',
data: {
email, password
},
});
console.log(res);
} catch (err) {
console.log(err.response.data.message);
}
};
如果这不能解决问题,那么cookie可能不属于http://127.0.0.1:3000
来源,因此浏览器不会发送它们。
我以前也遇到过同样的问题,这是因为我使用了"localhost";的";127.0.0.1";而不是在浏览器上的链接中,所以请确保您的浏览器链接是";http://127.0.0.1:3000/login">