Express 快速会话不保存数据

Express 快速会话不保存数据,express,session,mean-stack,express-session,Express,Session,Mean Stack,Express Session,我有一个简单的MEAN应用程序,我想实现一个简单的“自制”用户身份验证。我的想法是在他登录时将userId保存在会话中,并在每个页面请求上检查会话中是否存在userId(例如,在获取所有用户的列表时) 后端-server.js: const express = require("express"); const session = require("express-session"); const bodyParser = require("body-parser"); const cors =

我有一个简单的MEAN应用程序,我想实现一个简单的“自制”用户身份验证。我的想法是在他登录时将userId保存在会话中,并在每个页面请求上检查会话中是否存在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");
});
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");
      }
    });
  };
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"
  });
};
当用户单击登录按钮时,将调用来自前端控制器的方法:

Frontend-login.controller.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");
});
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");
      }
    });
  };
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"
  });
};
后端-login.controller.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");
});
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");
      }
    });
  };
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是否仍在会话中,稍后我将执行一些有用的操作)

前端登录服务中的
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解析器
。但是,当我尝试使用它时,我不会从数据库中获取任何数据,只显示静态文本。因此,我暂时将其从
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");
});
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");
      }
    });
  };
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"
  });
};
我尝试将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,它工作得很好