【问题标题】:Node.js Express.js Mongoose: Don't save sessionNode.js Express.js Mongoose:不保存会话
【发布时间】:2015-08-05 00:22:23
【问题描述】:

我最近正在尝试学习 node.js。我刚刚设置了Phonegap 项目并且req.session 是未定义的。 这是我的代码:app.js

var express = require('express'),
routes = require('./routes'),
data = require('./routes/data'),
login = require('./routes/login'),
asignatura = require('./routes/login'),
http = require('http'),
cookieParser = require('cookie-parser'),
path = require('path'),
session = require('express-session');

var app = express();

app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(cookieParser());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.cookieParser());
app.use(session({cookieName: 'session',
                     secret: "secret",
                     resave: true,
                saveUninitialized: true}));
if ('development' == app.get('env')) {
app.use(express.errorHandler());
}
app.get('/', routes.index);
app.post('/signIn', login.signIn);
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});

这是我的数据库模型和功能。 login.js

var mongoose = require('mongoose');
var bcrypt   = require('bcrypt-nodejs');
var loginSchema = mongoose.Schema({
_id:String,
pass:String,
tipo:String
});
loginSchema.methods.generateHash = function(pass) {
return bcrypt.hashSync(pass, bcrypt.genSaltSync(8), null);
};

loginSchema.methods.verifyPassword = function(pass) {
return bcrypt.compareSync(pass, this.login.pass);
};

  var login = mongoose.model('login', loginSchema);

 exports.signIn = function(req, res){
 var dniNum = req.body.dniNum;
 var password = req.body.password;

login.find({_id: dniNum, pass: password}, function(err, data){
    res.send({err: err, data: data});
    console.log(data);
    console.log(err);
   console.log(req.session);
   var user = req.session.data;
});

Index.ejs

<body>
 <div class="ui-header ui-bar-inherit" data-role="header">
    <h1 class="ui-title">Login</h1>
 </div>
   <div data-role="content" class="ui-content">
    <div>
     <h5>Cédula:<input type="text" name="dni" id="inputdniNum" placeholder="Cedula"/></h5>

     </div>
    <div>
        <h5>Contraseña</h5>
        <input type="password" id="inputPassword" placeholder="Password"/>
    </div>
       <br>
  <label id="errMsg" class="control-label"></label>

  <br>
     <div>
       <button id="signIn" type="submit" >Ingresar</button> 

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

登录.js

    $(document).ready(function(){
      $("#signIn").click(function(){
        var dniNum = $("#inputdniNum").val();
        var password = $("#inputPassword").val();

     if(dniNum == '' || password == ''){
        $("#form").addClass('has-error');
        $('#errMsg').html('El dni o la contraseña no puede estar vacia')
     } 
     else {

        var data = {
            dniNum: dniNum, 
            password: password
        };
        $.ajax({
            type: "post",
            url: "/signIn",
            data: data
        }).success(function (data, textstatus){
            if(data.data == 0){

           // if(data.dniNum !== dniNum && data.pass !== password){
                $("#form").addClass('has-error');
                $('#errMsg').html('El dni o la contraseña es incorrecta');
            }
            else {
                sessionStorage.setItem('signedInUser', JSON.stringify(data.data));
                    sessionStorage.getItem('signedInUser');
                    window.location.assign("/alumno_principal");

            }
        }).error(function (err, textStatus){
            alert(err + textStatus);
        })
    }
})

});

这在我的控制台中显示为错误,并且 req.session 未定义

  POST /signIn 200 68.854 ms - 120
  [ { _id: '11111', pass: '12345', tipo: 'estudiante' } ]
  null
  undefined

  /home/diego/Tesis/App/routes/login.js:86
    var user = req.session.data;
                          ^
  TypeError: Cannot read property 'data' of undefined
   at /home/diego/Tesis/App/routes/login.js:86:31
   at process._tickCallback (node.js:448:13)

【问题讨论】:

    标签: jquery node.js mongodb express mongoose


    【解决方案1】:

    您可以使用护照模块,它会处理身份验证过程

    var passport = require('passport');
    
    app.use(passport.initialize());      // Initialize PassportJS
    app.use(passport.session());     
    

    定义本地策略 local_strategy.js

    var passport = require('passport');
    var LocalStrategy = require('passport-local').Strategy;
    var models  = require('models');
    
    function PassportLocalStrategy() {
    
      LocalStrategy.call(this, { usernameField: 'email' },     this.verifyUser.bind(this));
    
      passport.serializeUser(function(user, done) {
      done(null, user.id);      
      passport.deserializeUser(this.get.bind(this));      
    }
    
    PassportLocalStrategy.prototype.get = function(id, done) {
        models.User.find({ where: { id: id } }).then(function(user){ done(null,     user.dataValues) });
    };
    
    PassportLocalStrategy.prototype.verifyUser = function(email, password, done) {
    models.User.find({ where: { email: email } }).then( function(user){ user;
      done(null, user.dataValues);
    })
    };
    
    module.exports = PassportLocalStrategy;
    

    【讨论】:

      【解决方案2】:

      passport js 是处理与 node.js express.js 应用程序会话的更好选择。

      此处提供完整的文档和配置以及示例示例 -

      https://github.com/jaredhanson/passport

      【讨论】:

        猜你喜欢
        • 2011-10-12
        • 2020-06-08
        • 2012-02-09
        • 2015-05-25
        • 2015-08-12
        • 1970-01-01
        • 2014-12-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多