express使用res.cookie无法设置cookie

发布于 2022-09-05 23:06:45 字数 3471 浏览 23 评论 0

router.post('/login', (req, res, next) => {
  const {userName, userPwd} = req.body;
  const params = {
    userName,
    userPwd,
  };
  User.findOne(params).then((doc) => {
    if (doc) {
      res.cookie('userId', doc.userId, {
        domain: 'http://127.0.0.1:8080',
        path: '/',
        maxAge: 5000000,
      });
      res.json({
        status: 0,
        msg: '',
        data: doc.userName,
      });
    } else {
      throw new Error('密码或者用户名错误');
    }
  }).catch((err) => {
    res.json({
      status: 1,
      msg: err.message,
      data: null,
    });
  });
});

router.get('/addressList', (req, res, next) => {
  console.log('addressList', req.cookies);
  const {userId} = req.cookies;
  User.findOne({userId})
  .then((doc) => {
    if (doc) {
      res.json({
        status: 0,
        msg: '',
        data: doc.addressList,
      })
    } else {
      throw new Error('没有该用户');
    }
  }).catch((err) => {
    res.json({
      status: 1,
      msg: err.message,
      data: null,
    });
  })
});

cors设置

app.use(cors({
    origin: 'http://127.0.0.1:8080',
    credentials: true,
}));
app.use(cookieParser());

前端代码

<script>
    function list() {
        var data = null;
        var xhr = new XMLHttpRequest();
        xhr.withCredentials = true;
        xhr.addEventListener("readystatechange", function () {
            if (this.readyState === 4) {
                console.log(this.responseText);
            }
        });
        xhr.open("GET", "http://localhost:3000/users/addressList");
        xhr.setRequestHeader("x-node", "nodejs");
        xhr.send(data);
    }


    function login() {
        var data = "userName=%E9%AC%BC%E5%89%91%E5%A3%AB&userPwd=665533";
        var xhr = new XMLHttpRequest();
        xhr.withCredentials = true;
        xhr.addEventListener("readystatechange", function () {
            if (this.readyState === 4) {
                console.log(this.responseText);
            }
        });
        xhr.open("POST", "http://localhost:3000/users/login");
        xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded");
        xhr.setRequestHeader("x-custom", "abcd");
        xhr.send(data);
    }

    login();

    setTimeout(() => {
        list();
    }, 3000 )
</script>

首先调用login,然后再login里面设置cookie然后调用list。在服务端也是获得了cookie,从浏览器NetWork也是有cook被set和发送

clipboard.png

clipboard.png

clipboard.png

但是重点是 在浏览器的cookie栏里并没有任何的cookie,而且使用document.cookie也是没有任何的cookie,不管实在node服务的3000端口下,还是在8080端口下都是没有任何cookie

clipboard.png

clipboard.png

clipboard.png

请问这是什么原因??

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

白昼 2022-09-12 23:06:45

访问的时候不要使用127.0.0.1来,用域名访问就可以了。有的浏览器在localhost的时候,会拒绝生成cookies。我之前遇到过一次这样的问题,后面用ip访问就没问题了。

something that wasn't made clear to me here and totally confused me for a while was that domain names must contain at least two dots (.), hence 'localhost' is invalid and the browser will refuse to set the cookie! instead for localhost you should use false.

to make your code work on both localhost and a proper domain, you can do this:

无边思念无边月 2022-09-12 23:06:45

用fetch发请求需要加上credentials : 'include' 才能保存cookie,被坑好久

时光与爱终年不遇 2022-09-12 23:06:45

我也碰到过和你一样的问题最后我的解决方法是

在客户端请求里,加入 withCredentials: 'include'
图片描述

在express的app.js里, cors的配置如图
图片描述

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文