【问题标题】:"Cannot read property 'user_id' of undefined" with express-session on Heroku“无法读取未定义的属性'user_id'”与 Heroku 上的快速会话
【发布时间】:2020-11-16 01:26:23
【问题描述】:

当我在本地运行我的应用程序时,我的会话可以正常工作。但是当我将它部署到 Heroku 时,我的会话停止工作。

我的应用配置在这里:

const express = require('express');
const session = require('express-session');
const cors = require('cors');
const bodyParser = require('body-parser');
const mysql = require('mysql');

// Setting up CORS, such that it can work together with an Application at another domain / port
index.use(cors({origin: [myapplink.com], credentials: true}));

// For being able to read request bodies
index.use(bodyParser.json());

// Initializing the session magic of express-session package
index.use(session({
    secret: "secret",
    resave: false,
    saveUninitialized: true,
    cookie: {
      expires: 7*24*3600*1000,
    }));

这里是我使用会话的地方:

//LOGIN
index.post("/api/login", function (req, res) {
  loginQuery = `SELECT user_id, username, gold, powder, settings FROM users WHERE (email = '${req.body.username}' OR username = '${req.body.username}') AND password = '${req.body.password}'`;
  pool.query(loginQuery, function (error, rows) {
    if (error) {
      console.error(error);
    } else {
      if (rows.length===1) {
        req.session.userData = rows[0];
        return res.status(200).send(true)
      } else {
        return res.status(500).send({
          error: 'Bad login data'
        });
      }
    }
  })
});

错误示例如下:

/**
 * Gets all user cards
 */
index.get('/api/getUnlockedCards', (req, res) => {
  query = `SELECT DISTINCT unlockedCards.card_id, cards.* FROM unlockedCards INNER JOIN cards ON unlockedCards.card_id = cards.card_id where unlockedCards.user_id = '${req.session.userData.user_id}'`;
  pool.query(query, function (error, rows) {
    if (error) {
      console.error(error);
    } else {
      return res.status(200).send(rows)
    }
  })
});

问题是当我尝试调用此端点时,我收到以下错误:

2020-07-26T16:28:54.693750+00:00 app[web.1]: TypeError: Cannot read property 'user_id' of undefined
2020-07-26T16:28:54.693750+00:00 app[web.1]: at Query.<anonymous> (/app/index.js:354:38)
2020-07-26T16:28:54.693751+00:00 app[web.1]: at Query.<anonymous> (/app/node_modules/mysql/lib/Connection.js:526:10)
2020-07-26T16:28:54.693751+00:00 app[web.1]: at Query._callback (/app/node_modules/mysql/lib/Connection.js:488:16)
2020-07-26T16:28:54.693752+00:00 app[web.1]: at Query.Sequence.end (/app/node_modules/mysql/lib/protocol/sequences/Sequence.js:83:24)
2020-07-26T16:28:54.693753+00:00 app[web.1]: at Query._handleFinalResultPacket (/app/node_modules/mysql/lib/protocol/sequences/Query.js:149:8)
2020-07-26T16:28:54.693753+00:00 app[web.1]: at Query.EofPacket (/app/node_modules/mysql/lib/protocol/sequences/Query.js:133:8)
2020-07-26T16:28:54.693754+00:00 app[web.1]: at Protocol._parsePacket (/app/node_modules/mysql/lib/protocol/Protocol.js:291:23)
2020-07-26T16:28:54.693754+00:00 app[web.1]: at Parser._parsePacket (/app/node_modules/mysql/lib/protocol/Parser.js:433:10)
2020-07-26T16:28:54.693755+00:00 app[web.1]: at Parser.write (/app/node_modules/mysql/lib/protocol/Parser.js:43:10)
2020-07-26T16:28:54.693755+00:00 app[web.1]: at Protocol.write (/app/node_modules/mysql/lib/protocol/Protocol.js:38:16)

有什么问题,我该如何解决?

【问题讨论】:

    标签: node.js heroku express-session


    【解决方案1】:

    在您的 index.js 文件中的路由和其他中间件之前添加 app.enable('trust proxy')

    【讨论】:

      【解决方案2】:

      我没有看到这里选择了会话后端。 The default won't work well on Heroku,您可能有多个活动进程:

      警告默认的服务器端会话存储MemoryStore故意不是为生产环境设计的。它在大多数情况下都会泄漏内存,不会扩展到单个进程之外,并且适用于调试和开发。

      lots of other back-ends。选择一个由某种共享持久层支持的(可能是 MySQL,因为您已经在使用它),安装会话存储后端,然后 use it as your store when you instantiate your session object

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-21
        • 2020-10-03
        • 1970-01-01
        • 2018-09-13
        相关资源
        最近更新 更多