我正在构建一个仅限移动端口的Node.js,使用Passport版本0.3.2进行本机注册。用户正在正确保存到MongoDB,但我无法发回正确的响应。这是我的代码:
passport.use('local-signup', new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
session: false
},
function(email, password, done) {
process.nextTick(function() {
User.findOne({
email: email.toLowerCase()
}, function(err, user) {
if (err) {
return done(err);
} else {
if (user) {
return done(null, false);
} else {
// Create new user if email does not exist
var newUser = new User();
// set the user's local credentials
newUser.email = email;
newUser.password = newUser.generateHash(password);
// save the user
newUser.save(function(err) {
if (err) {
console.log('throwing error: ' + err);
throw err;
}
console.log('the new user: ' + newUser);
return done(null, newUser);
});
}
}
});
});
}
));
这是我的用户模型类:
var mongoose = require('mongoose'),
Schema = mongoose.Schema,
passportLocalMongoose = require('passport-local-mongoose'),
bcrypt = require('bcrypt-nodejs'),
ObjectId = Schema.ObjectId;
var UserSchema = new Schema({
id: String,
email: String,
password: String,
dateRegistered: { type: Date, 'default': Date.now }
});
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);
};
UserSchema.plugin(passportLocalMongoose);
module.exports = mongoose.model('User', UserSchema);
而且,我在保存用户时收到500响应,如下所示:
新用户:
{ __v: 0,
password: '$2a$08$0GaE32gxf0jdW3vdxDxWeuSjYuwsOzZmHDhrov0ujPgSOl2imoE/C',
email: 'abcd@gmail.com',
_id: 58de8e71078555716a76c651,
dateRegistered: 2017-03-31T17:14:25.407Z }
响应
POST /signup 500 267.022 ms - -
Error: Failed to serialize user into session
at pass (/Users/abcd/Developer/node-apps/flow/node_modules/passport/lib/authenticator.js:271:19)
at Authenticator.serializeUser (/Users/abcd/Developer/node-apps/flow/node_modules/passport/lib/authenticator.js:289:5)
at IncomingMessage.req.login.req.logIn (/Users/abcd/Developer/node-apps/flow/node_modules/passport/lib/http/request.js:50:29)
at Strategy.strategy.success (/Users/abcd/Developer/node-apps/flow/node_modules/passport/lib/middleware/authenticate.js:235:13)
at verified (/Users/abcd/Developer/node-apps/flow/node_modules/passport-local/lib/strategy.js:83:10)
at /Users/abcd/Developer/node-apps/flow/server/config/passport.js:39:40
at /Users/abcd/Developer/node-apps/flow/node_modules/mongoose/lib/model.js:3702:16
at /Users/abcd/Developer/node-apps/flow/node_modules/mongoose/lib/services/model/applyHooks.js:146:20
at _combinedTickCallback (internal/process/next_tick.js:67:7)
at process._tickCallback (internal/process/next_tick.js:98:9)
答案 0 :(得分:0)
用户ID保存为会话数据,deserializeUser
用于检索整个对象以供将来使用。serializeUser
用于在会话中存储用户ID。 serializeUser
方法的结果存储为req.session.passport.user = {id : 'abcd'}
另一方面deserializeUser
基于参数给出了用户的对象,该参数是使用的关键意味着id。
// here user id is pass as a id of deserializeUser method to retrieve object
passport.serializeUser(function (user, done) {
done(null,user.id);
});
passport.deserializeUser(function (id, done) {
customer.findById(id, function (error, user) {
done(error, user);
});
});
<br />
// here user id is pass as a id of deserializeUser method to retrieve object
passport.serializeUser(function (user, done) {
done(null,user.id);
});
passport.deserializeUser(function (id, done) {
customer.findById(id, function (error, user) {
done(error, user);
});
});
<br />
Add bellow code to your server.js file
var express = require('express');
var session = require('express-session');
var app = express();
app.use(session({
secret : "secretkey",
resave : false,
saveUninitialized : false
}));
app.use(passport.initialize());
app.use(passport.session());
//now add path where your passport authentication file is placed.
require('./customerConfig/passport');