node.js - 部署到 heroku 和 netlify 后,express session 不会持续存在

标签 node.js express session heroku

我将 React 前端部署到 netlify,并将后端 Express 部署到 Heroku,并且我正在使用 session 。

该 session 在本地完美运行,但在我部署它时却不起作用

当我检查数据库时, session 已经建立,但是当我console.log(req.session)时,它没有记录任何内容

所以,看起来 session 保存在数据库上,但它没有保存在heroku服务器上

我需要在heroku上配置 session 吗?


mongoose.connect(
  "mydburl",
  {
    useNewUrlParser: true,
  }
);

const store = new MongoDBStore({
  uri:
    "mydburl",
  collection: "sessions",
});

app.use(
  cors({
    domain: url,
    origin: [url],
    methods: ["GET", "POST", "DELETE"],
    credentials: true,
  })
);
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

app.set("trust proxy", 1);
app.use(
  session({
    key: "userID",
    secret: "subscribe",
    proxy: true,
    resave: false,
    saveUninitialized: false,
    store: store,
    cookie: {
      secure: false,
      httpOnly: false,
      maxAge: null, //1000 * 60 * 60 * 24 * 7, 1 week
      domain: url,
    },
  })
);

app.get("/login", (req, res) => {
  if (req.session.user) {
    console.log(req.session.user);
    res.send({ isLogin: true, user: req.session.user });
  } else {
    console.log("req.session.user doesn't exist");
    res.send("no");
  }
});

app.post("/login", (req, res) => {
  const { username, password } = req.body;

  RegisterModel.find({ username }, (err, result) => {
    if (err) {
      console.log(err);
    }
    if (result.length > 0) {
      bcrypt.compare(password, result[0].password, (error, response) => {
        if (response) {
          req.session.user = result;
          res.send(result);
        } else {
          res.send("비밀번호가 맞지 않습니다");
        }
      });
    } else {
      res.send("아이디가 맞지 않습니다");
    }
  });
});

最佳答案

如果您还可以在创建 session 的地方添加前端部分,那将会非常有帮助。但我认为梳理前端和后端应该可以帮助你解决这个问题。

在 Heroku 上部署前端和后端。将您的 index.jsserver.js 更改为服务器的入口点,如下所示:

...
if (process.env.NODE_ENV === "production") {
  //Set static folder
  app.use(express.static("client/build"));
  app.get("*", (req, res) => {
    res.sendFile(path.resolve(__dirname, "client", "build", "index.html"));
  });
}

const port = process.env.PORT || 5000;

app.listen(port, () => console.log(`Server running on port ${port}`));

module.exports = { app };

在这里,我假设您的前端部分位于客户端文件夹内。您可以相应地更改它。

root_folder
   -server.js
   ....rest of server files
   package.json
   -client
        -build
        ....rest of React part
        package.json

另外,将其添加到服务器的 package.json 文件中。

"scripts": {
    ....
    "heroku-postbuild": "NPM_CONFIG_PRODUCTION=false npm install --prefix client && npm run build --prefix client"
  },

上述命令将首先安装客户端依赖项,然后创建用于部署的构建。

现在,如果检查 Heroku URL 是 https://xyz.herokuapp.com它应该显示您的前端,其余部分将同样工作。在本地,您可以通过手动创建构建(npm run build)并将process.env.NODE_ENV ===“生产”更改为process.env.NODE_ENV ===“development”来检查这一点,还要相应地更改 build 文件夹路径。现在,检查 http://localhost:5000 或您的本地后端服务器 URL。

您可以在这里阅读更多相关信息:https://create-react-app.dev/docs/deployment/#heroku

关于node.js - 部署到 heroku 和 netlify 后,express session 不会持续存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66062049/

相关文章:

node.js - 如何从 Node.js/Express 中的请求中检索实体主体(用于 CSP 违规报告)?

node.js - Mongoose nodejs "Unknown modifier: $pushAll"

javascript - 将区 block 链区 block 存储在数组中不是效率很低吗? ( Node .js)

node.js - Google 云任务队列端点位于哪里?有人可以使用 nodejs 子进程来代替吗?

node.js - 如何让${port}在express服务器上工作

node.js - REST API 仅在 Express 中获取 'Error: No default engine was specified and no extension was provided'

node.js - 你知道 Node js 中的任何像 activerecord 和建模系统这样的 Yii

ASP.NET 标识 session 超时

asp.net session 状态模式 "SQLServer"

java - Wicket - 刷新每个请求的组件(实现 session 超时倒计时)