我的数据库架构是
ActorSystem
我想使用电子邮件和密码进行护照验证。我的代码是:
var Account = new Schema({
email : String,
name : String ,
family : String ,
password : String
});
虽然
中没有任何用户名字段var LocalStrategy = require('passport-local').Strategy;
passport.use('register', new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
passReqToCallback : true
},
function(req, email, password, done) {
Account.findOne({ 'email' : email }, function(err, user) {
if (err)
{
return done(err);
}
else
{
var newaccount = new Account();
newaccount.password = bcrypt.hashSync(req.body.password);
newaccount.email = req.body.email;
newaccount.name = req.body.name;
newaccount.family = req.body.family;
// save the user
newaccount.save(function(err) {
if (err)
{
console.log('Error in Saving user: '+err);
throw err;
}
}
});
我第一次可以在数据库中插入而且我没有任何错误,但第二次我有这个错误,我认为它假定用户名为密钥,并且在第一次将用户名设置为null所以第二次因为重复键,它想要尝试将用户名设置为null throw错误。我在互联网上搜索了很多。我删除数据库并使用MongoError: E11000 duplicate key error index: Account.accounts.$username_1 dup key: { : null }
但问题没有解决。
答案 0 :(得分:0)
错误消息是因为已存在以null作为用户名的记录。你有一个带有null值的用户名feild.Mongo只允许一个索引的feild具有null值。如果有多个文档没有索引字段的值或者缺少索引字段,索引构建将失败重复键错误。您可以使用稀疏索引。
只需删除空文档。
使用mydb.users.getIndexes()检查您可以使用mydb.users.dropIndex()手动删除不需要的索引