NodeJS不喜欢护照+续集登录

时间:2017-07-01 00:18:32

标签: javascript node.js javascript-events passport.js sequelize.js

亲爱的,亲爱的,我会对nodejs发疯。我正在尝试使用Passport-Local和Sequelize库来实现由NodeJS支持的简单用户管理webapp的后端。现在我只是设计了用户模型。我遇到的主要问题是注册过程给我一个错误:看起来我正在处理一个未定义的对象。请有人帮我弄清楚发生了什么事吗?

这是我的代码(与我在互联网上找到的一些解决方案合并 - 显然没有任何作用,根据墨菲定律)。

如果代码字面上很糟糕,可以请Javascript程序员原谅我。我的理由是,这是我在Javascript中的第一次编程尝试,我必须为一个项目和最后一个(借口)做到这一点,但并非最不重要的是我在C和微芯片上长大。

ERROR:

TypeError: Cannot read property 'findOne' of undefined
    at Strategy._verify (/home/me/Documents/cerbero/config/passport.js:21:17)

app.js

var app = express();


//blabla favicon stuff

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));


app.use(session({ secret:'holaholaholaholaholaholahola',
                  resave:true,
                  saveUninitialized:true
                }));



app.use(passport.initialize());
app.use(passport.session());
app.use(flash());

app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

var models = require("./models")
require('./config/passport.js')(passport, models.usermodel);

app.use('/', index);
app.use('/user', require('./routes/users')(passport));


models.sequelize.sync().then(function(){
  console.log("Database connected");
}).catch(function(err) {
  console.log(err, "Somenthing went wrong with the dbdbdb");
});

 //blabla listening stuff



module.exports = app;

模型/ usermodel.js

    module.exports = function(sequelize, Sequelize) {
  var User = sequelize.define('user', {

        id: {
            autoIncrement: true,
            primaryKey: true,
            type: Sequelize.INTEGER
        },

        username: {
            type: Sequelize.TEXT
        },

        public_key: {
            type: Sequelize.TEXT
        },

        email: {
            type: Sequelize.STRING,
            validate: {
                isEmail: true
            }
        },

        password: {
            type: Sequelize.STRING,
            allowNull: false
        },

        last_login: {
            type: Sequelize.DATE
        },

    });

    return User;
}

路由/ users.js

var express = require('express');

module.exports = function(passport, user) {
  var router = express.Router();

  //blablabla other routes
  router.get('/signup', function(req,res,next) {
    res.render('signup', {message: req.flash('signupMessage')});
  });


  router.post('/signup', passport.authenticate('local-signup', {
    successRedirect: '/user/dashboard',
    failureRedirect: '/user/signup'}
  ));

  router.post('/login', passport.authenticate('local'), function(req, res) {
    res.redirect('/');
  });



  return router;
};

function isLogged(req, res, next) {
  if (req.isAuthenticated())
    return next();

  res.redirect('/');
};

EDIT 我忘记了护照策略。 passport.js

var bCrypt = require('bcrypt-nodejs');


module.exports = function(passport, user) {

    var User = user;
    var LocalStrategy = require('passport-local').Strategy;
    console.log('debug: sono nella routine');


    passport.use('local-signup', new LocalStrategy(

        {
            usernameField: 'email',
            passwordField: 'password',
            passReqToCallback: true
        },
        function(req, email, password, done) {


            User.findOne({
                where: {
                    email: email
                }
            }).then(function(user) {
                if (user) {
                  return done(null, false, {message: req.flash('email already taken')});
                  console.log('mail already taken');
                }
                else {
                    var pass = generateHash(password);

                    var data =

                        {
                            email: email,
                            password: pass,
                            username: req.body.username,
                            public_key: '0',
                            last_login: null

                        };

                    User.create(data).then(function(newUser, created) {

                        if (!newUser) {

                            return done(null, false);

                        }

                        if (newUser) {

                            return done(null, newUser, {message: req.flash('tappost')});

                        }

                        next();

                    });

                }

            });

        }

    ));

    passport.deserializeUser(function(id, done) {

        User.findById(id).then(function(user) {

            if (user) {

                done(null, user.get());

            } else {

                done(user.errors, null);

            }

        });

    });


    passport.serializeUser(function(user,done) {
      done(null, user.id);
    });

var generateHash = function(password) {
                return bCrypt.hashSync(password, bCrypt.genSaltSync(8), null);
              };

1 个答案:

答案 0 :(得分:0)

问题解决了。 "只是"改变了如何在passport.js中引用模型如下

var User = user;

必须重写为

var User = db.user;

这里是最终护照策略文件

const db = require('./../models/');
var bCrypt = require('bcrypt-nodejs');


module.exports = function(passport) {

    var User = db.user;
    var LocalStrategy = require('passport-local').Strategy;

    passport.use('local-signup', new LocalStrategy(

        {
            usernameField: 'email',
            passwordField: 'password',
            passReqToCallback: true
        },
        function(req, email, password, done) {
          var generateHash = function(password) {
            return bCrypt.hashSync(password, bCrypt.genSaltSync(8), null);
          };

            User.findOne({
                where: {
                    email: email
                }
            }).then(function(user) {
                if (user) {
                  return done(null, false, {message: req.flash('email already taken')});
                  console.log('mail already taken');
                }
                else {
                    var pass = generateHash(password);

                    var data =

                        {
                            email: email,
                            password: pass,
                            username: req.body.username,
                            public_key: '0',
                            last_login: null

                        };

                    User.create(data).then(function(newUser, created) {

                        if (!newUser) {

                            return done(null, false);

                        }

                        if (newUser) {

                            return done(null, newUser, {message: req.flash('tappost')});

                        }

                    });

                }

            }).catch(function(err) {
              console.log(err);
            });

        }

    ));


    passport.serializeUser(function(user, done) {
            done(null, user.id);
        });

        passport.deserializeUser(function(id, done) {
            User.findById(id).then(function(user){
                done(null, user);
            }).catch(function(e){
                done(e, false);
            });
        });




}