【问题标题】:A cookie is set at location `/set-cookie` but cannot be retrieved at `/user` using express.jscookie 设置在 `/set-cookie` 位置,但无法使用 express.js 在 `/user` 检索
【发布时间】:2018-11-12 03:21:48
【问题描述】:

我在 firebase 上托管了一个 node.js 应用程序。但是,它的托管位置在这里并不重要,因为我只是尝试将一些信息存储在 /set-cookie 路径中的 cookie 中,以便可以在 /user 路径中访问它。相关代码在index.ts这里:

// create HTTP server
const app = express();

// use json form parser middleware
app.use(bodyParser.json());

// use query string parser middlware
app.use(bodyParser.urlencoded({ extended: true }));


// cookies
app.use(cookieParser());

app.use(cookieSession({
      name   : 'session'
    , keys   : ['abigsecret', 'anothersecret']
    , maxAge : 100 * 60 * 60 * 1000
}));


// setting the cookie here
app.get('/set-cookie', (req,res) => {
    res.cookie('rememberme', '1', { expires: new Date(Date.now() + 900000), httpOnly: true });
    res.send('cookie set...');
}})



// And I would like to access it here
app.get('/user' , (req, res) => {
    console.log('cookies: ', req.cookies)
    res.render('pages/user')
});

当然,这并没有按预期工作。因为在控制台上我没有看到我在/set-cookie 中设置的cookie,而是看到了一些传递给服务器的客户端cookie。设置 cookie 以便我可以在其他地方访问它的方法是什么?

当我在“/get-cookie”之后导航到“/user”时,我在控制台上看到的是这个

info: cookies:  { _ga: 'GA1.1.1192529393.1524186034',
  ss_cvr: '5407c247-08f6-4b6d-8b27-e623c7788eef|1523239108805|1524436640490|1524443386060|46' }
info: 

但我应该看到一些版本的:'rememberme', '1', 对吗?

【问题讨论】:

  • 您是否在 /user 之前导航到 /set-cookie?对我来说似乎工作得很好。
  • @clockwatcher 是的。你是如何访问这个位的:'rememberme','1'?用我提供的代码?我的做一些不同的事情>可能是因为我的托管在 firebase 上?

标签: node.js firebase express cookies session-cookies


【解决方案1】:

以下是适合我的完整示例。

server.js

// create HTTP server
const express = require('express');
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');
const cookieSession = require('cookie-session');
const pug = require('pug');
const app = express();

app.set('views', './views');
app.set('view engine', 'pug');

// use json form parser middleware
app.use(bodyParser.json());

// use query string parser middlware
app.use(bodyParser.urlencoded({ extended: true }));


// cookies
app.use(cookieParser());

app.use(cookieSession({
      name   : 'session'
    , keys   : ['abigsecret', 'anothersecret']
    , maxAge : 100 * 60 * 60 * 1000
}));


// setting the cookie here
app.get('/set-cookie', (req,res) => {
    res.setHeader('Cache-Control', 'private');
    res.cookie('__session', '1', { expires: new Date(Date.now() + 900000), httpOnly: true });
    res.send('cookie set...');
});



// And I would like to access it here
app.get('/user' , (req, res) => {
    console.log(req.cookies);
    res.render('pages/user', {cookies: req.cookies})
});

app.listen(3000, () => { console.log('Listening on port 3000')});

然后查看/pages/user.pug:

doctype html
html
  body
    h1 Rememberme => #{cookies.__session}

首先在浏览器中导航到 http://localhost:3000/set-cookie 然后到 http://localhost:3000/user 对我有用。 console.log(req.cookies) 包含记住我并将其传递到模板中也可以。

【讨论】:

  • 好的,当我使用 app.listen 运行上面使用 node.js 服务器启动的示例时,cookie 已设置。事实上,我可以从许多 node.js 项目实例中访问 c​​ookie。问题是我实际上是在使用带有exports.app = functions.https.onRequest(app) 的firebase 服务器,所以由于某种原因我无法使用res.cookie 设置cookie,即使这是这里的文档中使用的:firebase.google.com/docs/auth/admin/manage-cookies。此外,当我部署站点时,它也无法在生产中设置 cookie。
  • 好的,在这里找到了答案:stackoverflow.com/questions/44929653/…。我只需要一行代码res.setHeader('Cache-Control', 'private'); above the res.cookie(...)`。
猜你喜欢
  • 2014-05-31
  • 2022-08-17
  • 2017-07-01
  • 1970-01-01
  • 2019-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多