我正在使用 scotch.io 教程为我正在开发的应用程序设置 PassportJS 本地登录。在设置了我的注册/登录页面、MongoDB、PassportJS 之后,我尝试创建一个测试“帐户”,然后……没有任何反应。没有重定向,没有 Flash 消息,什么都没有。似乎没有任何东西可以发布到数据库。我在下面包括了相关的脚本。我尽量忠实于教程布局(来源:https://scotch.io/tutorials/easy-node-authentication-setup-and-local)。
index.js(服务器入口点)
// load dependencies
var express = require('express');
var app = express();
var path = require('path');
var mongoose = require('mongoose');
var passport = require('passport');
var flash = require('connect-flash');
var LocalStrategy = require('passport-local').Strategy;
var morgan = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session');
var configDB = require('./config/database.js');
// setup views
var ejs = require('ejs');
var engine = require('ejs-locals');
//database configuration
mongoose.connect(configDB.url);
require('./config/passport')(passport);
app.use(morgan('dev'));
app.use(cookieParser());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
//view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use('/public', express.static(path.join(__dirname, 'public')));
// required for passport
app.use(session({
secret: 'ilovescotchscotchyscotchscotch',
resave: true,
saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session()); // persistent login sessions
app.use(flash()); // for flash messages stored in-session
// routes
require('./routes')(app, passport);
app.listen(3000, function () {
console.log('Example app listening on port 3000!')
});
passport.js( Passport 设置)
var LocalStrategy = require('passport-local').Strategy;
var User = require('../user');
module.exports = function(passport) {
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
passport.use('local-signup', new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true
},
function(req, email, password, done) {
process.nextTick(function() {
User.findOne({ 'local.email': email }, function(err, user) {
if (err)
return done(err);
if (user) {
return done(null, false, req.flash('signupMessage', 'That e-mail address is already taken.'));
} else {
var newUser = new User;
newUser.local.email = email;
newUser.local.password = newUser.generateHash(password);
newUser.save(function(err) {
if (err)
throw err;
return done(null, newUser);
});
}
});
});
}));
passport.use('local-login', new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true
},
function(req, email, password, done) {
User.findOne({ 'local.email': email }, function(err, user) {
if (err)
return done(err);
if (!user)
return done(null, false, req.flash('loginMessage', 'User not found.'));
if(!user.validPassword(password))
return done(null, false, req.flash('loginMessage', 'Invalid password, please try again.'));
return done(null, user);
});
}));
};
/config/database.js
module.exports = {
'url': 'mongodb://localhost:27017/users/'
}
路由.js
module.exports = function(app, passport) {
app.get('/', function (req, res) {
res.render('pages/index');
});
app.get('/login', function (req, res) {
res.render('pages/login', { message: req.flash('loginMessage') });
});
app.get('/signup', function (req, res) {
res.render('pages/signup', { message: req.flash('signupMessage') });
});
app.post('/signup', passport.authenticate('local-signup', {
successRedirect: '/profile',
failureRedirect: '/signup',
failureFlash: true
}));
app.post('/login', passport.authenticate('local-login', {
successRedirect: '/profile',
failureRedirect: '/login',
failureFlash: true
}));
app.get('/profile', isLoggedIn, function(req, res) {
res.render('profile.ejs', {
user: req.user
});
});
app.get('/addroom', function (req, res) {
res.render('pages/addroom.ejs', {
message: req.flash('addroomMessage')
});
});
app.get('/propconfig', function (req, res) {
res.render('pages/propconfig.ejs', {
message: req.flash('propconfigMessage')
});
});
app.get('/logout', function(req, res) {
req.logout();
res.redirect('/');
});
};
// route middleware to ensure a user is logged in
function isLoggedIn(req, res, next) {
if (req.isAuthenticated())
return next();
res.redirect('/');
}
user.js(用户模式)
// load dependencies
var mongoose = require('mongoose');
var bcrypt = require('bcrypt');
// define user schema
var userSchema = mongoose.Schema({
local: {
email: String,
password: String
}
});
// METHODS
// generating a hash
userSchema.methods.generateHash = function(password) {
return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
};
// checking if password is valid
userSchema.methods.validPassword = function(password) {
return bcrypt.compareSync(password, this.local.password);
};
// creating model for user to expose to app
module.exports = mongoose.model('User', userSchema);
最后是 signup.ejs(注册 UI 模板)
<!doctype html>
<html>
<head>
<title>Node Authentication</title>
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.2/css/bootstrap.min.css"> <!-- load bootstrap css -->
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css"> <!-- load fontawesome -->
<style>
body { padding-top:80px; }
</style>
<script src="https://code.jquery.com/jquery-3.1.1.min.js" integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" crossorigin="anonymous"></script>
<script src="http://code.jquery.com/ui/1.12.1/jquery-ui.min.js" integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU=" crossorigin="anonymous"></script>
</head>
<body>
<div class="container">
<div class="col-sm-6 col-sm-offset-3">
<h1><span class="fa fa-sign-in"></span> Signup</h1>
<!-- show any messages that come back with authentication -->
<% if (message.length > 0) { %>
<div class="alert alert-danger"><%= message %></div>
<% } %>
<!-- LOGIN FORM -->
<form action="/signup" method="post">
<div class="form-group">
<label>Email</label>
<input type="text" class="form-control" name="email" id="email">
<div id="emailError"></div>
</div>
<div class="form-group">
<label>Password</label>
<input type="password" class="form-control" name="password" id="password">
<div id="passwordError"></div>
</div>
<button type="submit" class="btn btn-warning btn-lg">Signup</button>
</form>
<hr>
<p>Already have an account? <a href="/login">Login</a></p>
<p>Or go <a href="/">home</a>.</p>
</div>
</div>
<script type="text/javascript" src="../public/javascripts/validate.js"></script>
</body>
</html>
更新: 我注释掉了我正在使用的电子邮件验证脚本,现在 POST 操作正在发生(为什么之前没有,我不知道),但它仍然没有到达数据库。
更新 #2:我尝试在 Debug模式下运行服务器。控制台返回此信息:
GET /signup 304 34.791 ms - -
express:router dispatching POST /signup +28s
express:router query : /signup +0ms
express:router expressInit : /signup +0ms
express:router logger : /signup +0ms
express:router cookieParser : /signup +1ms
express:router jsonParser : /signup +0ms
express:router urlencodedParser : /signup +3ms
express:router session : /signup +157ms
express:router initialize : /signup +2ms
express:router authenticate : /signup +0ms
express:router <anonymous> : /signup +1ms
POST /signup - - ms - -
express:router dispatching POST /signup +2m
express:router query : /signup +0ms
express:router expressInit : /signup +0ms
express:router logger : /signup +1ms
express:router cookieParser : /signup +1ms
express:router jsonParser : /signup +2ms
express:router urlencodedParser : /signup +0ms
express:router session : /signup +4ms
express:router initialize : /signup +1ms
express:router authenticate : /signup +2ms
express:router <anonymous> : /signup +1ms
POST /signup - - ms - -
与此同时,浏览器停留在 “等待本地主机...” 大约 2 或 3 分钟(没有崩溃或超时),然后最终返回“本地主机页面不工作
localhost 没有发送任何数据。 ERR_EMPTY_RESPONSE”
更新#3:这是另一个调试日志,检查所有模块(不仅仅是 Express):
express:router dispatching POST /signup +39s
express:router query : /signup +4ms
express:router expressInit : /signup +1ms
express:router logger : /signup +2ms
express:router cookieParser : /signup +5ms
express:router jsonParser : /signup +3ms
body-parser:json content-type "application/x-www-form-urlencoded" +0ms
body-parser:json skip parsing +4ms
express:router urlencodedParser : /signup +1ms
body-parser:urlencoded content-type "application/x-www-form-urlencoded" +0ms
body-parser:urlencoded content-encoding "identity" +3ms
body-parser:urlencoded read body +0ms
body-parser:urlencoded parse body +60ms
body-parser:urlencoded parse extended urlencoding +5ms
express:router session : /signup +8ms
express-session fetching 6M-W_9dEFDmsPBvNp2d0UmeBE9gDuXMn +14ms
express-session no session found +3ms
express:router initialize : /signup +9ms
express:router authenticate : /signup +0ms
express:router <anonymous> : /signup +2ms
req.body: {"email":"matt@matt.matt","password":"pass1234"}
mquery findOne +20ms users { 'local.email': 'matt@matt.matt' } { fields: {} }
express-session saving EkaL4tXbUCZ9QXHDGt2XWxlgMjVGejAC +95ms
express-session split response +1ms
express-session set-cookie connect.sid=s%3AEkaL4tXbUCZ9QXHDGt2XWxlgMjVGejAC.cvTE1KsUvIzbnNqHP0ns9td75MUkR4mKRDvwuHk%2B4jE; Path=/; HttpOnly +4ms
morgan log request +17ms
POST /signup 302 237.147 ms - 58
express:router dispatching GET /signup +9ms
express:router query : /signup +2ms
express:router expressInit : /signup +0ms
express:router logger : /signup +1ms
express:router cookieParser : /signup +2ms
express:router jsonParser : /signup +0ms
body-parser:json skip empty body +0ms
express:router urlencodedParser : /signup +13ms
body-parser:urlencoded skip empty body +0ms
express:router session : /signup +1ms
express-session fetching EkaL4tXbUCZ9QXHDGt2XWxlgMjVGejAC +1ms
express-session session found +3ms
express:router initialize : /signup +1ms
express:router authenticate : /signup +1ms
express:router <anonymous> : /signup +1ms
express:view lookup "pages/signup.ejs" +6ms
express:view stat "/media/matt/PORTABLE/myapp/views/pages/signup.ejs" +1ms
express:view render "/media/matt/PORTABLE/myapp/views/pages/signup.ejs" +1ms
express-session saving EkaL4tXbUCZ9QXHDGt2XWxlgMjVGejAC +18ms
express-session split response +0ms
morgan log request +10ms
GET /signup 200 50.407 ms - 1736
最佳答案
首先像这样改变你的本地策略
passport.use(new LocalStrategy(
{
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true
}, function () {
//LocalStrategy verify callback
}
));
然后像这样改变你的路线/注册
app.post('/signup', function (req, res, next) {
passport.authenticate('local', {failureRedirect: '/login'},
function (req, email, password, done) {
process.nextTick(function () {
User.findOne({'local.email': email}, function (err, user) {
if (err)
return done(err);
if (user) {
return done(null, false, req.flash('signupMessage', 'That e-mail address is already taken.'));
} else {
var newUser = new User;
newUser.local.email = email;
newUser.local.password = newUser.generateHash(password);
newUser.save(function (err) {
if (err){
throw err;}
//res.redirect("/path")
return done(null, newUser);
});
}
});
});
})(req, res, next);
});
你可以像这样从 res.redirect("/path") 重定向到其他页面
您在 route 定义的路线即
app.post('/signup', passport.authenticate('local-signup', {
successRedirect: '/profile',
failureRedirect: '/signup',
failureFlash: true
}));
它没有工作,因为你不能直接在你的路由中定义 passport.authenticate,而且你的数据库连接工作正常,它从数据库中获取结果,数据库连接没有问题。
关于javascript - PassportJS 没有将注册数据传递到数据库,可能是数据库连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42743705/
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/
我有一个奇怪的问题:我在rvm上安装了rubyonrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use
大家好!我想知道Ruby中未使用语法ClassName.method_name调用的方法是如何工作的。我头脑中的一些是puts、print、gets、chomp。可以在不使用点运算符的情况下调用这些方法。为什么是这样?他们来自哪里?我怎样才能看到这些方法的完整列表? 最佳答案 Kernel中的所有方法都可用于Object类的所有对象或从Object派生的任何类。您可以使用Kernel.instance_methods列出它们。 关于没有类的Ruby方法?,我们在StackOverflow
我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle