【问题标题】:How to check session in Node.js Express?如何在 Node.js Express 中检查会话?
【发布时间】:2017-12-25 20:45:14
【问题描述】:

我尝试检查 Express 4 中的会话是否存在:

if(req.session.user == undefined) {}

它给了我错误:

 Cannot read property 'user' of undefined

如何检查会话中是否存在值?

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    来自source

    如何使用快速会话?

    在开始实际代码之前,我想先说几句 快速会话模块。要使用此模块,您必须包含 在你的项目中表达。像所有包裹一样,我们必须首先 包括它。

    server.js
    var express = require('express');
    var session = require('express-session');
    var app = express();
    

    在此之后,我们必须初始化会话,我们可以通过 使用以下。

    app.use(session({secret: 'ssshhhhh'}));
    

    这里的 ‘secret’ 用于 cookie 处理等,但我们必须放一些 在 Express 中管理 Session 的秘密。

    现在使用“请求”变量,您可以将会话分配给任何变量。 就像我们在 PHP 中使用 $_SESSION 变量一样。例如

    var sess;
    app.get('/',function(req,res){
        sess=req.session;
        /*
        * Here we have assign the 'session' to 'sess'.
        * Now we can create any number of session variable we want.
        * in PHP we do as $_SESSION['var name'].
        * Here we do like this.
        */
        sess.email; // equivalent to $_SESSION['email'] in PHP.
        sess.username; // equivalent to $_SESSION['username'] in PHP.
    });
    

    创建像 sess.email 这样的 Session 变量后,我们可以检查 该变量是否在其他路由器中设置并可以跟踪 会话轻松。

    【讨论】:

    • 我问的是如何检查是否存在会话,而不是如何使用
    • 我不需要创建会话并检查后
    【解决方案2】:

    首先,这取决于您使用的库,也许某些库有实用程序,我假设您使用的是express-session

    没关系:

    if(req.session.user){}
    

    它们没用:

    if(typeof req.session.user !== "undefined"){}
    
    if(typeof req.session.user !== "undefined" || req.session.user === true){}
    

    原因req.session是一个对象,和普通对象一样:

    var obj = { name : "adam" }
    

    如果您尝试获取它不存在且未定义的 obj.age, 对象的getter函数,首先检查它是否存在,如果不存在,则不会产生致命错误,而是将该属性分配给未定义值。

    这很酷,所以obj.age 得到了 undefined (JS 有undefined 作为值类型),而且undefined 是一个假值(当你强制它为布尔值时,它变成了假,所以它是假的),这意味着你可以简单地在这样的条件语句中检查它:if(obj.age){}

    【讨论】:

      【解决方案3】:

      你不能只创建一个没有任何中间件的会话(我假设这是你尝试过的)。

      阅读 express-session 中间件文档,可在此处找到:

      https://github.com/expressjs/session

      基本实现示例:

      创建会话:

      app.use(session({
        genid: function(req) {
          return genuuid() // use UUIDs for session IDs
        },
        secret: 'keyboard cat'
      }))
      

      阅读会话:

      // Use the session middleware
      app.use(session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }}))
      
      // Access the session as req.session
      
      app.get('/', function(req, res, next) {
        var sess = req.session
        if (sess.views) {
          sess.views++
          res.setHeader('Content-Type', 'text/html')
          res.write('<p>views: ' + sess.views + '</p>')
          res.write('<p>expires in: ' + (sess.cookie.maxAge / 1000) + 's</p>')
          res.end()
        } else {
          sess.views = 1
          res.end('welcome to the session demo. refresh!')
        }
      })
      

      您可以在网上找到许多教程,例如:

      https://www.thepolyglotdeveloper.com/2015/01/session-management-expressjs-web-application/

      【讨论】:

        【解决方案4】:

        您面临的问题可能是您没有在所有请求中使用会话中间件。 您可以通过以下方式查看:

        1. 将此添加到您的所有路线中:

        app.use(session({ secret: 'keyboard cat',resave:false,saveUninitialized:false, cookie: { maxAge: 60000 }}));
        1. 认证路径:

        router.post('/', function(req, res, next) {
          //login logic here
        
          //if login successfull
          req.session.user = username //your unique identifier
          req.send("Hurray! logged in");
        
          //else
          req.send("Credentials error");
        
        });
        1. 签到任意路线:

        router.get('/dashboard', function(req, res, next) {
          if (req.session.user)
            //do stuff here
          else
          //redirect to login page
        
        })

        这行得通:)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-09
          • 1970-01-01
          • 2018-10-03
          • 1970-01-01
          • 2016-03-31
          相关资源
          最近更新 更多