快速会话不保存数据
express-session not saving data
我有一个简单的 MEAN 应用程序,我想实现一个简单的 "home-made" 用户身份验证。我的想法是在他登录的时候将userId保存在session中,每次页面请求时(比如获取所有用户的列表时)检查session中是否存在userId。
后端 - server.js:
const express = require("express");
const session = require("express-session");
const bodyParser = require("body-parser");
const cors = require("cors");
const app = express();
var MemoryStore = session.MemoryStore;
app.use(
session({
name: "app.sid",
secret: "my_s3cr3t",
resave: true,
store: new MemoryStore(),
saveUninitialized: true
})
);
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(cors());
const dbConfig = require("./config/database.config.js");
const mongoose = require("mongoose");
mongoose.Promise = global.Promise;
mongoose
.connect(dbConfig.url)
.then(() => {
// ...
})
.catch(err => {
// ...
process.exit();
});
require("./app/routes/user.routes.js")(app);
require("./app/routes/task.routes.js")(app);
require("./app/routes/login.routes.js")(app);
app.listen(3333, () => {
console.log("Server is listening on port 3333");
});
当用户点击登录按钮时,调用前端控制器的方法:
前端 - login.controller.js:
vm.login = function() {
userService.getUserByUsername(vm.username).then(user => {
if (user.password === vm.password) {
console.log("Login ok");
loginService.login(user).then(($window.location.href = "/#!main"));
} else {
console.log("Login not ok");
}
});
};
后端 - login.controller.js:
exports.login = (req, res) => {
req.session.userId = req.body._id;
req.session.save(function(err) {
console.log(err); // prints out "undefined", so there's no error
});
console.log(req.session);
res.status(200).send({
message: "Login ok"
});
};
前端 LoginController 打印出 "Login ok"(假设我输入了正确的凭据)并将我重定向到使用 main.controller.js
:
的 "main" 页面
同时,后端登录控制器打印出如下内容:
Session {
cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true },
userId: '5b4746cafe30b423181ad359' }
所以会话内容中肯定有一个userId
。但是,当我被重定向到 main.html
并且 main.controller.js
被调用时,它会调用:
loginService.getSession().then(data => console.log(data));
(我只是想检查userId是否还在会话中,稍后我会执行一些有用的操作)
前端 LoginService 中的 getSession()
方法仅执行 $http
调用:
function getSession() {
return $http.get("http://localhost:3333/session").then(
function(response) {
return response.data;
},
function(error) {
console.log(error.status);
}
);
}
这个调用了后端LoginController中定义的方法:
exports.getSession = (req, res) => {
console.log(req.session);
if (req.session.userId) {
res
.status(200)
.send({ message: "Session existing with userId " + req.session.userId });
} else {
res.status(404).send({ message: "Session not existing" });
}
};
前端调用在控制台中打印状态代码 404,而在后端我得到以下输出:
Session {
cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true } }
(不存在 userId
...)
还有一件事...在一些教程中我看到他们正在使用 cookie-parser
。但是,当我尝试使用它时,我没有从我的数据库中获取任何数据,只显示静态文本。所以我暂时从 server.js
.
中删除了它
编辑:
我尝试将 MongoStore 添加到我的应用程序:
const MongoStore = require("connect-mongo")(session);
...
app.use(
session({
name: "app.sid",
secret: "G4m1F1c4T10n_@ppL1c4t10N",
resave: true,
saveUninitialized: false,
cookie: { maxAge: 600000 },
store: new MongoStore({ url: "mongodb://localhost:27017/myAppDb" })
})
);
...但没有任何改变。
如何让我的会话正常工作?
正如我在与几个人交谈后发现的那样,会话或多或少已被弃用,处理这些事情的新方法是令牌。所以我切换到 JWT,它运行良好。
我有一个简单的 MEAN 应用程序,我想实现一个简单的 "home-made" 用户身份验证。我的想法是在他登录的时候将userId保存在session中,每次页面请求时(比如获取所有用户的列表时)检查session中是否存在userId。
后端 - server.js:
const express = require("express");
const session = require("express-session");
const bodyParser = require("body-parser");
const cors = require("cors");
const app = express();
var MemoryStore = session.MemoryStore;
app.use(
session({
name: "app.sid",
secret: "my_s3cr3t",
resave: true,
store: new MemoryStore(),
saveUninitialized: true
})
);
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(cors());
const dbConfig = require("./config/database.config.js");
const mongoose = require("mongoose");
mongoose.Promise = global.Promise;
mongoose
.connect(dbConfig.url)
.then(() => {
// ...
})
.catch(err => {
// ...
process.exit();
});
require("./app/routes/user.routes.js")(app);
require("./app/routes/task.routes.js")(app);
require("./app/routes/login.routes.js")(app);
app.listen(3333, () => {
console.log("Server is listening on port 3333");
});
当用户点击登录按钮时,调用前端控制器的方法:
前端 - login.controller.js:
vm.login = function() {
userService.getUserByUsername(vm.username).then(user => {
if (user.password === vm.password) {
console.log("Login ok");
loginService.login(user).then(($window.location.href = "/#!main"));
} else {
console.log("Login not ok");
}
});
};
后端 - login.controller.js:
exports.login = (req, res) => {
req.session.userId = req.body._id;
req.session.save(function(err) {
console.log(err); // prints out "undefined", so there's no error
});
console.log(req.session);
res.status(200).send({
message: "Login ok"
});
};
前端 LoginController 打印出 "Login ok"(假设我输入了正确的凭据)并将我重定向到使用 main.controller.js
:
同时,后端登录控制器打印出如下内容:
Session {
cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true },
userId: '5b4746cafe30b423181ad359' }
所以会话内容中肯定有一个userId
。但是,当我被重定向到 main.html
并且 main.controller.js
被调用时,它会调用:
loginService.getSession().then(data => console.log(data));
(我只是想检查userId是否还在会话中,稍后我会执行一些有用的操作)
前端 LoginService 中的 getSession()
方法仅执行 $http
调用:
function getSession() {
return $http.get("http://localhost:3333/session").then(
function(response) {
return response.data;
},
function(error) {
console.log(error.status);
}
);
}
这个调用了后端LoginController中定义的方法:
exports.getSession = (req, res) => {
console.log(req.session);
if (req.session.userId) {
res
.status(200)
.send({ message: "Session existing with userId " + req.session.userId });
} else {
res.status(404).send({ message: "Session not existing" });
}
};
前端调用在控制台中打印状态代码 404,而在后端我得到以下输出:
Session {
cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true } }
(不存在 userId
...)
还有一件事...在一些教程中我看到他们正在使用 cookie-parser
。但是,当我尝试使用它时,我没有从我的数据库中获取任何数据,只显示静态文本。所以我暂时从 server.js
.
编辑:
我尝试将 MongoStore 添加到我的应用程序:
const MongoStore = require("connect-mongo")(session);
...
app.use(
session({
name: "app.sid",
secret: "G4m1F1c4T10n_@ppL1c4t10N",
resave: true,
saveUninitialized: false,
cookie: { maxAge: 600000 },
store: new MongoStore({ url: "mongodb://localhost:27017/myAppDb" })
})
);
...但没有任何改变。
如何让我的会话正常工作?
正如我在与几个人交谈后发现的那样,会话或多或少已被弃用,处理这些事情的新方法是令牌。所以我切换到 JWT,它运行良好。