【问题标题】:Expressjs - Cannot set property 'userId' of undefined in session variableExpressjs - 无法在会话变量中设置未定义的属性“userId”
【发布时间】:2017-12-11 20:57:37
【问题描述】:

我正在使用 mysql 数据库在 express.js 中实现登录和注册功能。我的注册逻辑运行良好。但登录不起作用。相反,它会抛出错误,

TypeError:无法设置未定义的属性“userId” 和 抛出错误; // 重新抛出非 MySQL 错误 我的 routes/user.login 代码如下。

exports.login = function(req, res){
var message = '';
var sess = req.session;

if(req.method == "POST"){
   var post  = req.body;
   var name= post.user_name;
   var pass= post.password;

  var sql="SELECT id, first_name, last_name, user_name FROM `users` WHERE `user_name`='"+name+"' and password = '"+pass+"'";
  db.query(sql, function(err, results){
     if(results.length){
        req.session.userId = results[0].id;
        req.session.user = results[0];
        console.log(results[0].id);
        res.redirect('/home/dashboard');
     }
     else{
        message = 'Wrong Credentials.';
        res.render('index.ejs',{message: message});
     }

  });
    }else {
        res.render('index.ejs',{message: message});
 }
};

而我的login.ejs文件如下。

<html lang="en">
 <head>
    <meta charset="UTF-8">
    <title>Sample Site</title>

    <link rel="stylesheet"href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css"/>

 </head>
 <body id="clrblk">
    <div class="container">
    <div id="loginbox" style="margin-top:50px;" class="mainbox col-md-6 col-md-offset-3 col-sm-8 col-sm-offset-2">
        <div class="panel panel-info" >
                <div class="panel-heading">
                    <div class="panel-title">Sign In</div>
                    <!--<div style="float:right; font-size: 80%; position: relative; top:-10px"><a href="#">Forgot password?</a></div>-->
                </div>

                <div style="padding-top:30px" class="panel-body" >
                                                                    <% if (message.length > 0) { %>
                                                                                <div class="alert alert-danger col-sm-12"><%= message %></div>
                                                                    <% } %>

                    <form id="loginform" class="form-horizontal" role="form" method="post" action="/login">

                        <div style="margin-bottom: 25px" class="input-group">
                                    <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
                                    <input id="login-username" type="text" class="form-control" name="user_name" value="" placeholder="username">
                                </div>

                        <div style="margin-bottom: 25px" class="input-group">
                                    <span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></span>
                                    <input id="login-password" type="password" class="form-control" name="password" placeholder="password">
                                </div>



                        <div class="input-group">
                                  <!--<div class="checkbox">
                                    <label>
                                      <input id="login-remember" type="checkbox" name="remember" value="1"> Remember me
                                    </label>
                                  </div>-->
                                </div>


                            <div style="margin-top:10px" class="form-group">
                                <!-- Button -->

                                <div class="col-sm-12 controls">
                                  <button id="btn-login" type="submit" class="btn btn-success">Login  </button>


                                </div>
                            </div>


                            <div class="form-group">
                                <div class="col-md-12 control">
                                    <div style="border-top: 1px solid#888; padding-top:15px; font-size:85%" >
                                        Don't have an account!
                                    <a href="/signup">
                                        Sign Up Here
                                    </a>
                                    </div>
                                </div>
                            </div>
                        </form>



                    </div>
                </div>
    </div>

</div>
</body>
</html>

【问题讨论】:

    标签: mysql node.js mean-stack


    【解决方案1】:

    您的应用程序中似乎没有安装会话模块。使用以下npmcommand 安装express-session

    npm install express-session
    

    然后require 并在你的app.js 文件中配置它

    var expressSession = require('express-session');
    app.use(expressSession({secret: 'your secret', saveUninitialized: true, resave: false}));
    

    之后,它应该可以正常工作了。

    【讨论】:

    • 谢谢,我想通了。未安装表达式会话。在 app.js 中安装和配置后,我的应用运行良好。
    【解决方案2】:

    仅供后人阅读,如果安装express-session模块后仍然无法解决问题,请阅读本文。

    我遇到了同样的问题,因为我还在学习 NodesJS、Express ...

    我的错误是我在index.js 底部的某处使用了expressSession 中间件

    但是,MiddleWares 应该在一开始就定义。也就是说,在解析器到达我的expressSession 中间件之前我得到了错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-13
      • 1970-01-01
      • 2014-11-24
      • 2016-08-21
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多