【问题标题】:cookies not saved in browser- Nodejscookie 未保存在浏览器中 - Nodejs
【发布时间】:2021-05-16 14:47:56
【问题描述】:

我正在尝试使用 axios npm 包访问登录 api 这是我的 api 网址http://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);
  }
 
};

当我们在 postman 中使用 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创建登录令牌并设置cookies

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);
 
});

【问题讨论】:

    标签: node.js express cookies


    【解决方案1】:

    我建议添加 axios withCredentials: 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 来源,因此浏览器不会发送它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-05
      • 2018-05-19
      • 2019-11-04
      • 2013-11-02
      • 1970-01-01
      • 2018-11-19
      • 2021-02-28
      相关资源
      最近更新 更多