快速会话未保存数据

时间:2018-07-29 09:49:57

标签: 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 = 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" })
  })
);

...但是什么都没有改变。

如何使我的会话正常工作?

1 个答案:

答案 0 :(得分:0)

正如我在与几个人交谈后发现的那样,会议或多或少被弃用,并且处理这些问题的新方法是令牌。所以我改用JWT,它的运行效果很好。