快速会话不保存数据

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,它运行良好。