使用同构提取时的新会话ID

时间:2018-02-01 01:51:34

标签: node.js express express-session

使用isomorphic-fetch与Express会话相关的请求承诺(特别是Express会话ID)时出现意外行为:

作为故障排除过程的一部分,我在client.js中实现了两个方法,用于调用server.js中的端点:1)isomorphic-fetch,以及2)request-promise。

Client.js

// Method 1: isomorphic-fetch
require('es6-promise').polyfill();
require('isomorphic-fetch');

fetch('http://localhost:3000', {
  credentials: 'same-origin',
})
.then(function(response) {
  console.log(response.status);
});

fetch('http://localhost:3000', {
  credentials: 'same-origin',
})
.then(function(response) {
  console.log(response.status);
});

// Method 2: request-promise
var rp = require('request-promise').defaults({
 jar: true
});

function requestPage() {
  return rp('http://localhost:3000/');
}
requestPage()
  .then(console.dir)
  .then(requestPage)
  .then(console.dir)
  .catch(console.error);

Server.js

var app = require('express')();
app.use(require('morgan')('dev'));
var session = require('express-session');
var FileStore = require('session-file-store')(session);

app.use(session({
  name: 'server-session-cookie-id',
  secret: 'my express secret',
  saveUninitialized: true,
  resave: true,
  store: new FileStore(),
  cookie: {
    secure: false
  }
}));

app.get('/', function initViewsCount(req, res, next) {
console.log('req.session.id = ' + req.session.id);
  if (typeof req.session.views === 'undefined') {
    req.session.views = 1;
    return res.end('Welcome to the file session demo. Refresh page!');
  }
  return next();
});

app.get('/', function incrementViewsCount(req, res, next) {
  console.assert(typeof req.session.views === 'number',
  'missing views count in the session', req.session);
  req.session.views++;
  return next();
})

app.use(function printSession(req, res, next) {
  console.log('req.session', req.session);
  return next();
});

app.get('/', function sendPageWithCounter(req, res) {
  res.setHeader('Content-Type', 'text/html');
  res.write('<p>views: ' + req.session.views + '</p>\n');
  res.end();
});

var server = app.listen(3000, function () {
  var host = server.address().address;
  var port = server.address().port;
  console.log('Example app listening at http://%s:%s', host, port);
});

当我执行node client.js时,这是服务器的输出:

req.session.id = deWKCvqcyGiAvVSUvHv2Db7sjvE7xN1E
req.session.id = MxLHWjbMMvV4GRfPSf6sQ12XvauiJJot
req.session.id = A3KTLMdBopQ7pAfcTsJhnzzdokdA7hGI
GET / 200 1.407 ms - -
GET / 200 7.625 ms - -
GET / 200 0.728 ms - -
req.session.id = A3KTLMdBopQ7pAfcTsJhnzzdokdA7hGI
req.session Session {
  cookie:
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true,
     secure: false },
  views: 2,
  __lastAccess: 1517449125197 }
GET / 200 6.902 ms - -

我确认方法2(请求 - 承诺)成功地在服务器上保持会话。换句话说,会话A3KTLMdBopQ7pAfcTsJhnzzdokdA7hGI与此方法相关联。

但是,从输出中观察到,方法1(isomorphic-fetch)在服务器上生成两个单独的会话。

问题:为什么isomorphic-fetch会在服务器上创建两个单独的会话?

执行故障排除

  1. 我将localhost替换为127.0.0.1,但这并没有改变行为。
  2. 我将same-origin替换为include,但这并没有改变行为。
  3. 环境:

    • node v6.10.3
    • isomorphic-fetch 2.2.1
    • request-promise 4.2.2

0 个答案:

没有答案