我从头开始重新创建了项目,并遇到了相同的错误 这是我的passport.js //
var passport = require('passport');
var User = require('../models/user');
var LocalStrategy = require('passport-local').Strategy;
passport.serializeUser(function(user, done){
done(null, user.id);
});
passport.deserializeUser(function(id, done){
User.findById(id, function(err, user){
done(err, user);
});
});
console.log(4);
passport.use('local.signup', new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
},
function (req, email, password, done) {
User.findOne({'email': email}, function(err,user){
if(err){
return done(err);
}
if(user){
return done(null, false,{message:'Email is already in use'});
}
var newUser = new User();
newUser.email = email;
newUser.password = newUser.encryptPassword(password);
newUser.save(function(err, result){
if(err){
return done(err);
}
return done(null, newUser);
});
}
)
}
));
// index.js
var express = require('express');
var router = express.Router();
var csrf = require('csurf');
var passport =require('passport');
var Product = require('../models/product');
var User = require('../models/user');
var csrfProtection = csrf({cookie: true});
router.use(csrfProtection);
/* GET home page. */
router.get('/', function(req, res, next) {
Product.find(function(err, docs){
var productChunks = [];
var chunkSize= 3;
for (var i = 0; i < docs.length; i+=chunkSize) {
productChunks.push(docs.slice(i,i+ chunkSize));
}
res.render('shop/index', { title: 'Express' ,products : productChunks});
});
});
router.get('/user/signup', function(req, res, next){
res.render('user/signup',{csrfToken: req.csrfToken()});
});
router.post('/user/signup', passport.authenticate('local.signup',{
successRedirect: '/user/profile',
failureRedirect: '/user/signup',
failureFlash: true
}));
router.get('/user/profile', function(req, res, next){
res.render('user/profile');
});
module.exports = router;
// 用户模型架构
var mongoose = require('mongoose');
var Schema =mongoose.Schema;
var bcrypt = require('bcrypt-nodejs');
var userSchema = new Schema({
email: {type:String, required:true},
password: {type:String, required:true}
});
userSchema.methods.encryptPassword = function (password) {
return bcrypt.hashSync(password, bcrypt.genSaltSync(5),null);
};
userSchema.methods.validPassword = function (password) {
return bcrypt.compareSync(password, this.password);
};
module.exports = mongoose.model('User', userSchema);
// app.js
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var indexRouter = require('./routes/index');
var expressHbs = require('express-handlebars');
var mongoose = require('mongoose');
var session= require('express-session');
var passport = require('passport');
var flash = require('connect-flash');
var app = express();
mongoose.connect('mongodb://127.0.0.1:27017/shopping',{useNewUrlParser: true});
require('./config/passport');
// view engine setup
app.engine('.hbs',expressHbs({defaultLayout: 'layout', extname: '.hbs'}));
app.set('view engine', 'hbs');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(session({secret: 'mysupersecret', resave: false, saveUninitialized: false}));
app.use(flash());
app.use(passport.initialize());
app.use(passport.session());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', indexRouter);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
// 模板signup.hbs
<div class="wrapper fadeInDown">
<div id="formContent">
<!-- Tabs Titles -->
<!-- Icon -->
<div class="fadeIn first">
<i class="fa fa-user signupicon" aria-hidden="true"></i>
</div>
<!-- Login Form -->
<form class="" action="/user/signup" method="post">
<input type="text" id="login" class="fadeIn second" name="login" placeholder="login">
<input type="text" id="password" class="fadeIn third" name="login" placeholder="password">
<input type="hidden" name="_csrf" value="{{ csrfToken }}">
<button class="btn btn-primary" type="submit">Login</button>
</form>
<!-- Remind Passowrd -->
<div id="formFooter">
<a class="underlineHover" href="#">Forgot Password?</a>
</div>
</div>
</div>
//
成功注册后,应将用户重定向到个人资料页面,但身份验证失败,并且在猫鼬数据库中找不到任何“用户”集合,但存在“产品”集合