使用passport.authenticate()后,我的快递服务器路由全部停止响应
我正在创建一个小型演示应用程序,以使用passport.js,sequelize和express来学习用户身份验证。当我点击我的/ register端点时,它创建一个用户帐户就好了。如果我点击我的/ logIn端点,如果我给它正确的凭据,它将返回正确的用户。
我遇到的问题是,在启动服务器并命中/ register或/ logIns端点后,服务器将停止响应所有GET和POST请求,直到我重新启动服务器。
这是我的index.js代码:
var express = require('express')
var bodyParser = require('body-parser')
var Sequelize = require('sequelize')
var session = require('express-session')
var passport = require('passport')
var bCrypt = require('bcrypt')
var LocalStrategy = require('passport-local').Strategy
var flash = require('connect-flash')
var morgan = require('morgan')
var app = express()
app.use(express.static('public'))
app.use(bodyParser.json())
app.use(session({ secret: 'keyboard cat' }))
app.use(passport.initialize())
app.use(passport.session())
app.use(flash())
// Sequelize & Sequelize models
var sequelize = new Sequelize('auth_demo', 'auth_demo', 'auth_demo', {
host: 'localhost',
dialect: 'mysql'
})
var User = sequelize.define('user', {
id: {
type: Sequelize.INTEGER,
autoIncrement: true,
primaryKey: true
},
username: {
type: Sequelize.STRING
},
password: {
type: Sequelize.STRING
}
})
// Server initialization stuff
require('./config/passport.js')(passport, User)
sequelize
.sync()
.then(() => {
console.log('Connection successfully established')
})
.catch(err => {
console.log('Unabled to connect:', err)
})
app.listen(3000, () => {
console.log('App is running on port 3000')
})
// Routes.
app.post('/register', passport.authenticate('local-signup'),
function(req, res) {
res.send(req.user)
})
app.post('/logIn', function(req, res, next) {
passport.authenticate('local-signin', function(err, user, info) {
if (err) {
console.log("found err")
return next(err)
}
if (!user) {
console.log("didnt find user")
return res.redirect('/')
}
req.logIn(user, function(err) {
console.log("executing login")
if (err) { return next(err) }
console.log(req)
return res.send(user)
})
})(req, res, next)
})
app.get('/loggedInUser', function(req, res) {
console.log(req.user)
res.send(req.user)
})
app.get('/test', (req, res) => {
console.log(req)
res.send('Hello')
})
另外,这里是passport.js文件来显示策略:
const LocalStrategy = require('passport-local').Strategy
const bCrypt = require('bcrypt')
module.exports = function(passport, User) {
// Passport stuff
passport.serializeUser(function(user, done) {
done(null, user.id)
})
passport.deserializeUser(function(user, done) {
User.findById(user.id, function(err,user) {
done(err, user)
})
})
// Configure passport strategy
passport.use('local-signup', new LocalStrategy({
usernameField: 'username',
passwordField: 'password'
},
function (username, password, done) {
var generateHash = function(password) {
return bCrypt.hashSync(password, bCrypt.genSaltSync(8), null)
}
User.findOne({ where: { username: username } }).then(function(user) {
if (user) {
return done(null, false, { message: 'That user already exists' })
} else {
console.log("Creating user")
var userPassword = generateHash(password)
User.create({
username: username,
password: userPassword
})
.then(function(newUser) {
if (!newUser) {
return done(null, false)
}
if (newUser) {
return done(null, newUser)
}
})
}
})
}
))
passport.use('local-signin', new LocalStrategy({
usernameField: 'username',
passwordField: 'password',
passReqToCallback: true
},
function (req, username, password, done) {
var isValidPassword = function(userpass, password) {
return bCryptpareSync(password, userpass)
}
User.findOne({
where: {
username: username
}
}).then(function(user) {
if (!user) {
console.log("didnt find user")
return done(null, false, {
message: 'User does not exist'
})
}
if (!isValidPassword(user.password, password)) {
console.log("bad password")
return done(null, false, {
message: 'Incorrect password'
})
}
return done(null, user)
})
.catch(function(err) {
console.log("Error:", err)
return done(null, false, {
message: 'Something went wrong with your signin'
})
})
}
))
}
如果我在尝试命中/ logIn端点或/ register端点之前命中该/测试端点,它可以正常工作并按预期打印“hello”。但是,如果我在启动服务器后立即点击/ logIn或/ register端点然后尝试命中/测试请求将挂起而不会去任何地方。
以下是快速调试器挂起时在终端中打印的内容:
express:router dispatching GET /test +4s
express:router query : /test +1ms
express:router expressInit : /test +0ms
express:router serveStatic : /test +0ms
express:router jsonParser : /test +2ms
express:router session : /test +0ms
express:router initialize : /test +0ms
express:router authenticate : /test +0ms
它停在快递:路由器验证,所以我倾向于相信它是护照。
感谢任何帮助,谢谢。
回答如下:我想出来,发布在这里以防万一其他人遇到这个问题。 User.findById
是以承诺为基础的。之后我没有调用.then
。
使用passport.authenticate()后,我的快递服务器路由全部停止响应
我正在创建一个小型演示应用程序,以使用passport.js,sequelize和express来学习用户身份验证。当我点击我的/ register端点时,它创建一个用户帐户就好了。如果我点击我的/ logIn端点,如果我给它正确的凭据,它将返回正确的用户。
我遇到的问题是,在启动服务器并命中/ register或/ logIns端点后,服务器将停止响应所有GET和POST请求,直到我重新启动服务器。
这是我的index.js代码:
var express = require('express')
var bodyParser = require('body-parser')
var Sequelize = require('sequelize')
var session = require('express-session')
var passport = require('passport')
var bCrypt = require('bcrypt')
var LocalStrategy = require('passport-local').Strategy
var flash = require('connect-flash')
var morgan = require('morgan')
var app = express()
app.use(express.static('public'))
app.use(bodyParser.json())
app.use(session({ secret: 'keyboard cat' }))
app.use(passport.initialize())
app.use(passport.session())
app.use(flash())
// Sequelize & Sequelize models
var sequelize = new Sequelize('auth_demo', 'auth_demo', 'auth_demo', {
host: 'localhost',
dialect: 'mysql'
})
var User = sequelize.define('user', {
id: {
type: Sequelize.INTEGER,
autoIncrement: true,
primaryKey: true
},
username: {
type: Sequelize.STRING
},
password: {
type: Sequelize.STRING
}
})
// Server initialization stuff
require('./config/passport.js')(passport, User)
sequelize
.sync()
.then(() => {
console.log('Connection successfully established')
})
.catch(err => {
console.log('Unabled to connect:', err)
})
app.listen(3000, () => {
console.log('App is running on port 3000')
})
// Routes.
app.post('/register', passport.authenticate('local-signup'),
function(req, res) {
res.send(req.user)
})
app.post('/logIn', function(req, res, next) {
passport.authenticate('local-signin', function(err, user, info) {
if (err) {
console.log("found err")
return next(err)
}
if (!user) {
console.log("didnt find user")
return res.redirect('/')
}
req.logIn(user, function(err) {
console.log("executing login")
if (err) { return next(err) }
console.log(req)
return res.send(user)
})
})(req, res, next)
})
app.get('/loggedInUser', function(req, res) {
console.log(req.user)
res.send(req.user)
})
app.get('/test', (req, res) => {
console.log(req)
res.send('Hello')
})
另外,这里是passport.js文件来显示策略:
const LocalStrategy = require('passport-local').Strategy
const bCrypt = require('bcrypt')
module.exports = function(passport, User) {
// Passport stuff
passport.serializeUser(function(user, done) {
done(null, user.id)
})
passport.deserializeUser(function(user, done) {
User.findById(user.id, function(err,user) {
done(err, user)
})
})
// Configure passport strategy
passport.use('local-signup', new LocalStrategy({
usernameField: 'username',
passwordField: 'password'
},
function (username, password, done) {
var generateHash = function(password) {
return bCrypt.hashSync(password, bCrypt.genSaltSync(8), null)
}
User.findOne({ where: { username: username } }).then(function(user) {
if (user) {
return done(null, false, { message: 'That user already exists' })
} else {
console.log("Creating user")
var userPassword = generateHash(password)
User.create({
username: username,
password: userPassword
})
.then(function(newUser) {
if (!newUser) {
return done(null, false)
}
if (newUser) {
return done(null, newUser)
}
})
}
})
}
))
passport.use('local-signin', new LocalStrategy({
usernameField: 'username',
passwordField: 'password',
passReqToCallback: true
},
function (req, username, password, done) {
var isValidPassword = function(userpass, password) {
return bCryptpareSync(password, userpass)
}
User.findOne({
where: {
username: username
}
}).then(function(user) {
if (!user) {
console.log("didnt find user")
return done(null, false, {
message: 'User does not exist'
})
}
if (!isValidPassword(user.password, password)) {
console.log("bad password")
return done(null, false, {
message: 'Incorrect password'
})
}
return done(null, user)
})
.catch(function(err) {
console.log("Error:", err)
return done(null, false, {
message: 'Something went wrong with your signin'
})
})
}
))
}
如果我在尝试命中/ logIn端点或/ register端点之前命中该/测试端点,它可以正常工作并按预期打印“hello”。但是,如果我在启动服务器后立即点击/ logIn或/ register端点然后尝试命中/测试请求将挂起而不会去任何地方。
以下是快速调试器挂起时在终端中打印的内容:
express:router dispatching GET /test +4s
express:router query : /test +1ms
express:router expressInit : /test +0ms
express:router serveStatic : /test +0ms
express:router jsonParser : /test +2ms
express:router session : /test +0ms
express:router initialize : /test +0ms
express:router authenticate : /test +0ms
它停在快递:路由器验证,所以我倾向于相信它是护照。
感谢任何帮助,谢谢。
回答如下:我想出来,发布在这里以防万一其他人遇到这个问题。 User.findById
是以承诺为基础的。之后我没有调用.then
。