【问题标题】:Why is node.js not passing my session to a segment it calls为什么 node.js 没有将我的会话传递给它调用的段
【发布时间】:2020-10-28 04:44:23
【问题描述】:

在 node.js 中,我的入口点段 (app.js) 在快速会话建立后调用另一个段。被调用的段需要请求('req')对象中的会话字段,但它不存在。

这是完整的 app.js:

const express = require('express');
const path = require('path');
const nunjucks = require('nunjucks');
const helmet = require('helmet');
const csp = require('helmet-csp');
const uuid = require('uuid/v4');
const fs = require('fs');
const https = require('https');
const cookieMiddleware = require('./app/middleware/cookie-message.js');
const cookieDetailsGet = require('./app/routes/cookies/cookie-details.get.js');
const cookiePolicyPost = require('./app/routes/cookies/cookie-policy.post.js');
const cookiePolicyGet = require('./app/routes/cookies/cookie-policy.get.js');
const nonceMiddleware = require('./app/middleware/nonce.js');
const cookieParser = require('cookie-parser');

let app = express();
const session = require('express-session');
const RedisStore = require('connect-redis')(session);
const bodyParser = require('body-parser');

const i18next = require('i18next');
const i18nextMiddleware = require('i18next-express-middleware');
const i18nextFsBackend = require('i18next-node-fs-backend');
const config = require('./app/config/config');
const i18nextOptions = require('./app/config/i18nextOptions');
const { getRedisClient } = require('./app/services/redis-client');

const router = express.Router;

/* Generate nonce. */
const nonce = Buffer.from(uuid().toString('base64'));
app.use((req, res, next) => {
  res.locals.nonce = nonce;
  next();
});
// configure Nunjucks templating
nunjucks.configure(['views',
  path.join(__dirname, 'node_modules/morris-frontend/'),
  path.join(__dirname, 'node_modules/morris-frontend/morris/components/'),
  path.join(__dirname, 'app/views/')
], {
  autoescape: true,
  express: app
});

// secure apps by setting various HTTP headers
app.use(helmet());

app.use(csp({
  directives: {
    defaultSrc: ["'self'"],
    styleSrc: ["'self'"],
    scriptSrc: [
      "'self'",
      `'nonce-${nonce}'`, // Pass the nonce value along.
      "'sha256-+6WnXIl4mbFTCARd8N3COQmT3bJJmo32N8q8ZSQAIcU='",
    ],
    imgSrc: ["'self'"],
    fontSrc: ["'self'"]
  }
}));

// referrerPolicy
app.use(helmet.referrerPolicy({ policy: 'no-referrer-when-downgrade' }));

// view engine setup
app.set('views', path.join(__dirname, 'app/views'));
app.set('view engine', 'html');
app.use(bodyParser.urlencoded({
  extended: true
}));

app.use(cookieParser());
cookieMiddleware(
  app,
  config.CONSENT_COOKIE_NAME,
  config.COOKIE_POLICY,
  config.COOKIE_CONSENT,
  '/decision/',
  config.GOOGLE_TAG_MANAGER_DOMAIN
);

// Language support
i18next.use(i18nextFsBackend)
  .use(i18nextMiddleware.LanguageDetector)
  .init(i18nextOptions);

app.use(i18nextMiddleware.handle(i18next, {
  removeLngFromUrl: false
}));

// Redis session
const sessionStore = new RedisStore({
  client: getRedisClient(),
  prefix: 'bl:',
  ttl: parseInt(config.sessionTTL, 10),
  logErrors: (err) => {
    log.error('Redis session error', {
      err_message: err.message,
      err_stack: err.stack
    });
  }
});

app.use(session({
  secret: config.sessionSecret,
  store: sessionStore,
  resave: false,
  saveUninitialized: false
}));

app.use(bodyParser.json());
app.use('/decision', express.static(path.join(__dirname, 'node_modules/morris-frontend/morris')));
app.use('/decision', express.static(path.join(__dirname, 'app/public/grants')));

// Cookie policy pages
app.get(`/${config.COOKIE_DETAILS}`, cookieDetailsGet(
  config.COOKIE_POLICY,
  config.CONSENT_COOKIE_NAME,
  config.SESSION_COOKIE_NAME,
  config.COOKIE_CONSENT,
  config.sessionsTTL
));
app.get(`/${config.COOKIE_POLICY}`, cookiePolicyGet(config.COOKIE_DETAILS));
app.post(`/${config.COOKIE_POLICY}`, cookiePolicyPost(
  config.CONSENT_COOKIE_NAME,
  '/',
  config.GOOGLE_TAG_MANAGER_DOMAIN
  ));

// Defining the Router
//app.use(require('./app/routes/routes'));
require('./app/routes/monitoring')(app);

if (process.env.HTTPS_ON === 'true') {
  const httpsKeys = {
    key: fs.readFileSync(process.env.HTTPS_KEY, 'utf-8'),
    cert: fs.readFileSync(process.env.HTTPS_CRT, 'utf-8')
  };
  app = https.createServer(httpsKeys, app);
}

app.listen(process.env.PORT || 3001, () => {
  const protocol = process.env.HTTPS_ON ? 'https' : 'http';
  const port = process.env.PORT || 3001;
  console.log(`Server running on ${protocol}://localhost:${port}`); // eslint-disable-line no-console
});

module.exports = { app, router };

搞砸的电话是这样的:

cookieMiddleware(
  app,
  config.CONSENT_COOKIE_NAME,
  config.COOKIE_POLICY,
  config.COOKIE_CONSENT,
  '/decision/',
  config.GOOGLE_TAG_MANAGER_DOMAIN
);

这是 cookie-message.js 的顶部(被调用的部分:

const qs = require('querystring');
const setConsentCookie = require('../utils/set-consent-cookie.js');
const removeGTMCookies = require('../utils/remove-gtm-cookies.js');

module.exports = (app, consentCookieName, cookiePolicy, cookieConsent, mountUrl, proxyMountUrl = mountUrl, gtmDomain, useTLS = false) => {
  const reProxyMountUrl = new RegExp(`^${proxyMountUrl}`);
  const sanitiseUrl = (url) => url.replace(reProxyMountUrl, mountUrl).replace(/\/+/g, '/');

  // URL to cookie policy page
  const cookiePolicyUrl = `${mountUrl}${cookiePolicy}`;

  // Set template options for cookie consent banner
  app.use((req, res, next) => {
    console.log('inside cookie-message.js');
    console.log('req.session=', req.session);

console.log 调用显示 req.session 未定义。 有什么建议吗?

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    如果您想在cookieMiddleware() 中使用会话,则必须将会话中间件移动到调用cookieMiddleware() 之前。现在,你有会话中间件,所以 req.session 在调用 cookieMiddleware() 时尚未配置。

    中间件按照注册顺序运行,因此要使用req.session,会话中间件必须在您尝试使用req.session的中间件之前运行。因此,您可以将cookieMiddleware() 移到后面(在会话中间件之后),或者在调用cookieMiddleware() 之前将您的会话中间件移到前面。

    【讨论】:

    • @jenkinz - 这对你有意义吗?它对你有用吗?你好像消失了。
    • 工作正常。我消失了,因为该吃晚饭了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 2012-03-12
    • 2018-09-09
    • 1970-01-01
    相关资源
    最近更新 更多