亲爱的,亲爱的,我会对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);
};
答案 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);
});
});
}