我正在通过一个关于passport.js和身份验证的教程,我正在解开 . 我现在正在测试注册功能,我的应用程序正在冻结 . 这是我的服务器文件:

var  express            =   require('express'),
 app                =   express(),
 mongoose           =   require('mongoose'),
 passport           =   require('passport'),
 flash              =   require('connect-flash'),
 morgan             =   require('morgan'),
 cookieParser       =   require('cookie-parser'),
 bodyParser         =   require('body-parser'),
 session            =   require('express-session');

//  configDB           =   require('./config/database.js');

mongoose.connect('mongodb://localhost/Auth_practice');

require('./config/passport')(passport); // pass passport for config

// set up express app
app.use(morgan('dev'));         // log every request to the console
app.use(cookieParser());        // read cookies (required for auth)   
app.use(bodyParser());          // get information from html forms

app.set('view engine','ejs')//为模板设置ejs

// required for passport
app.use(session({secret: 'ilovethetoonandrafa'}));      // session secret
app.use(passport.initialize());
app.use(passport.session());                            // for persistent login 
sessions
app.use(flash());


 // routes
 require('./app/routes.js')(app, passport);              // load our routes 
 and pass in passport




app.listen(process.env.PORT, process.env.IP, function(){
console.log("Server has started")
});

这是我的用户模型:

// load the things we need
var mongoose = require('mongoose');
var bcrypt = require('bcrypt-nodejs');

// define schema for our user model
var userSchema = mongoose.Schema({

local           :{
    email       : String,
    password    : String,
},
facebook        :{
    id          : String,
    token       : String,
    email       : String,
    name        : String
},
twitter         :{
    id          : String,
    token       : String,
    displayName : String,
    username    : String
},
google          :{
    id          : String,
    token       : String,
    email       : String,
    name        : String
}
});

// method =========================
// generate a hash
userSchema.methods.generateHash = function(password) {
    return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
};

// check if password is valid
userSchema.methods.validPassword = function(password) {
    return bcrypt.compareSync(password, this.local.password);
};

//  create the model for users and expose it to our app
module.exports = mongoose.model('User', userSchema);

我的策略设置:

// config/passport.js

// load all the things we need
var LocalStrategy   = require('passport-local').Strategy;

// load up the user model

var User = require('../ app / models / user');

// expose this function to our app using module.exports

module.exports = function(passport){

// =========================================================================
// passport session setup ==================================================
// =========================================================================
// required for persistent login sessions
// passport needs ability to serialize and unserialize users out of session

// used to serialize the user for the session
passport.serializeUser(function(user, done) {
    done(null, user.id);
});

// used to deserialize the user
passport.deserializeUser(function(id, done) {
    User.findById(id, function(err, user) {
        done(err, user);
    });
});

// =========================================================================
// LOCAL SIGNUP ============================================================
// =========================================================================
// we are using named strategies since we have one for login and one for signup
// by default, if there was no name, it would just be called 'local'

passport.use('local-signup', new LocalStrategy({
    // by default, local strategy uses username and password, we will override with email
    usernameField : 'email',
    passwordField : 'password',
    passReqToCallback : true // allows us to pass back the entire request to the callback
},
function(req, email, password, done) {

    // asynchronous
    // User.findOne wont fire unless data is sent back
    process.nextTick(function() {

    // find a user whose email is the same as the forms email
    // we are checking to see if the user trying to login already exists
    User.findOne({ 'local.email' :  email }, function(err, user) {
        // if there are any errors, return the error
        if (err)
            return done(err);

        // check to see if theres already a user with that email
        if (user) {
            return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
        } else {

            // if there is no user with that email
            // create the user
            var newUser            = new User();

            // set the user's local credentials
            newUser.local.email    = email;
            newUser.local.password = newUser.generateHash(password);

            // save the user
            newUser.save(function(err) {
                if (err)
                    throw err;
                return done(null, newUser);
            });
        }

    });    

    });

}));

};

我的注册路线

app.post('/signup', passport.authenticate('local-signup', {
    successRedirect: '/profile', // redirect to the secure profile of the 
user
    failureRedirect: '/signup',  // redirect to signup page if failure
    failureFlash: true // allow flash messages
}));

最后这里是注册表格:

<!-- views/signup.ejs -->
<!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>
</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">
    </div>
    <div class="form-group">
        <label>Password</label>
        <input type="password" class="form-control" name="password">
    </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>
</body>

谁能看到导致应用冻结的原因?