我将 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.js
或 server.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/