2016-09-24 72 views
0

我有一个快速的应用程序,我试图添加护照本地猫鼬的用户,但每当我尝试创建一个用户,我得到一个错误说MissingUsernameError: No username was given护照本地猫鼬错误:没有用户名被给出

下面是相关代码:

用户模式:

var mongoose = require('mongoose'); 
var passportLocalMongoose = require('passport-local-mongoose'); 

var UserSchema = new mongoose.Schema({ 
    username: String, 
    password: String, 
}); 

UserSchema.plugin(passportLocalMongoose); 

module.exports = mongoose.model("User", UserSchema); 

register.ejs:

<div class="field"> 
    <div class="two fields"> 
    <div class="field"> 
     <input type="text" name="email" value="<%= email %>"> 
    </div> 
    <div class="field"> 
     <input type="password" name="password" placeholder="password"> 
    </div> 
    </div> 
</div> 

app.js:

var mongoose  = require('mongoose'), 
passport   = require('passport'), 
LocalStrategy  = require('passport-local'), 
User    = require('./models/user'), 


app.use(require('express-session')({ 
    secret: 'very secret words', 
    resave: false, 
    saveUninitialized: false 
})); 
app.use(passport.initialize()); 
app.use(passport.session()); 
passport.use(new LocalStrategy(User.authenticate())); 
passport.serializeUser(User.serializeUser()); 
passport.deserializeUser(User.deserializeUser()); 

//New user creation 
app.post('/newuser', function(req, res){ 
    var newUser = new User({username: req.body.email}); 
    console.log(newUser); 
    User.register(newUser, req.body.password, function(err, user){ 
    if(err){ 
     console.log('error registering user'); 
     console.log(err); 
     return res.send('oops'); 
    } 
    passport.authenticate('local')(req, res, function(){ 
     res.redirect('/matches'); 
    }); 
    }); 
}); 

任何人都可以看到我错过了?谢谢! :)

回答

0

首先,所有路由

app.use(express.bodyParser());

你已经因为passport.authenticate('local')检查这些请求期间给喜欢usernamepassword这两个领域在形式检查后前务必给body-parser代码价值观,如果任何人不匹配,那么它不会工作。

请参考Passport.js文档了解更多详情

http://passportjs.org/docs/username-password

更新

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

// CHANGE: USE "createStrategy" INSTEAD OF "authenticate" 
passport.use(User.createStrategy()); 

passport.serializeUser(User.serializeUser()); 
passport.deserializeUser(User.deserializeUser()); 

The reason for this functionality is that when using the usernameField option to specify an alternative usernameField name, for example "email" passport-local would still expect your frontend login form to contain an input field with name "username" instead of email . This can be configured for passport-local but this is double the work. So we got this shortcut implemented.

https://github.com/saintedlama/passport-local-mongoose

1

行,所以我找到了解决我的p如果有其他人在这里遇到同样的问题。

我在注册表格中有enctype="multipart/form-data"。删除它可以解决问题。我不明白为什么,所以如果任何人都可以阐明这一点,我会非常感激。

另外,我可以看到另一个问题在地平线上;我希望此表单不仅可以注册用户的用户名和密码,还可以向数据库添加有关它们的信息,包括照片。据我所知,如果我想从表单上传文件,我需要enctype="multipart/form-data"。有没有人知道这个解决方案? (这应该是一个单独的问题?)

+0

我没有任何enctype = multipart/form-data和ahappens相同给我:( – Despertaweb

+1

如果你仍然有麻烦发布一些代码,我会看看如果 –

+0

我很好!刚刚解决了,现在thanx @Runny Yolk,我真的很感谢你的帮助:D 它调用了config.secrekey config.secret的instea,没有犯下错误:S – Despertaweb