Javascript NodeJS不';我不喜欢护照&x2B;续集登录

Javascript NodeJS不';我不喜欢护照&x2B;续集登录,javascript,node.js,sequelize.js,dom-events,passport.js,Javascript,Node.js,Sequelize.js,Dom Events,Passport.js,我对nodejs快发疯了。我正在尝试使用Passport Local和Sequelize库实现一个由NodeJS支持的简单用户管理webapp的后端。现在我刚刚设计了用户模型。我的主要问题是注册过程给了我一个错误:看起来我正在处理一个未定义的对象。有人能帮我弄清楚发生了什么事吗 这是我的代码(与我在互联网上找到的一些解决方案合并在一起——根据墨菲定律,显然什么都不起作用) 如果代码不好,请Javascript程序员原谅我。我的理由是,这是我第一次尝试使用Javascript编程,我必须为一个项目

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

这是我的代码(与我在互联网上找到的一些解决方案合并在一起——根据墨菲定律,显然什么都不起作用)

如果代码不好,请Javascript程序员原谅我。我的理由是,这是我第一次尝试使用Javascript编程,我必须为一个项目这样做,最后(借口),但并非最不重要的是,我是在C和微芯片的环境中长大的

错误:

TypeError:无法读取未定义的属性“findOne” 在策略中进行验证(/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;
models/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;
}
routes/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('/');
};
编辑 我忘了护照策略。 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);
              };
问题解决了。 “Just”更改了如何引用passport.js中的模型,如下所示

var User = user;
不得不重写为

var User = db.user;
这里是最终的passport策略文件

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);
            });
        });




}

错误来自您的passport.js文件,但这是您没有包含供我们查看的文件!你说得对。我编辑了这个问题。现在你可以找到代码了。嗨,我想做passportJS登录和注册功能。你能和我分享一些关于这方面的教程或博客吗?