Javascript NodeJS不';我不喜欢护照&x2B;续集登录
我对nodejs快发疯了。我正在尝试使用Passport Local和Sequelize库实现一个由NodeJS支持的简单用户管理webapp的后端。现在我刚刚设计了用户模型。我的主要问题是注册过程给了我一个错误:看起来我正在处理一个未定义的对象。有人能帮我弄清楚发生了什么事吗 这是我的代码(与我在互联网上找到的一些解决方案合并在一起——根据墨菲定律,显然什么都不起作用) 如果代码不好,请Javascript程序员原谅我。我的理由是,这是我第一次尝试使用Javascript编程,我必须为一个项目这样做,最后(借口),但并非最不重要的是,我是在C和微芯片的环境中长大的 错误: TypeError:无法读取未定义的属性“findOne” 在策略中进行验证(/home/me/Documents/cerbero/config/passport.js:21:17) app.jsJavascript 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编程,我必须为一个项目
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登录和注册功能。你能和我分享一些关于这方面的教程或博客吗?