Passport Local Mongoose Error:没有给出用户名

时间:2016-09-24 17:32:52

标签: node.js express mongoose passport.js passport-local

我有一个快速应用程序,我正在尝试添加护照本地猫鼬的用户,但每当我尝试创建用户时,我都会收到错误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);

以下是相关代码:

用户架构:

<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>

register.ejs:

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');
    });
  }); 
});

app.js:

a[[i]]

任何人都能看到我错过的东西吗?谢谢! :)

6 个答案:

答案 0 :(得分:2)

首先,确保在所有路线之前提供body-parser代码

app.use(express.bodyParser());

之后检查您在请求期间是否已在表单中同时提供了usernamepassword这两个字段,因为passport.authenticate('local')检查了这些值,如果有人不匹配,那么它就不会工作

有关详细信息,请参阅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());
  

此功能的原因在于,当使用usernameField选项指定备用usernameField名称时,例如&#34; email&#34; passport-local仍然希望您的前端登录表单包含名为"username" instead of email的输入字段。这可以配置为本地护照,但这是工作的两倍。所以我们实现了这个快捷方式。

请参阅https://github.com/saintedlama/passport-local-mongoose

答案 1 :(得分:1)

好的,所以我找到了我的问题的解决方案 - 以防其他人来到这里遇到同样的问题。

我在注册表单中有enctype="multipart/form-data"。删除此功能可以解决问题。我不明白为什么,所以如果有人能说清楚我会非常感激。

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

答案 2 :(得分:0)

从name =“ email”更改输入的“ name”属性值 命名为=“用户名” 可以解决它

答案 3 :(得分:0)

确保在路由之前添加正文解析器。

我遇到了与失踪相同的问题

app.use(bodyParser.urlencoded({extended : false}));

答案 4 :(得分:0)

我找到了解决方法。

像这样更改架构结构:

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

,然后在<form>标记中更改您的姓名属性:

<input name="username" />

答案 5 :(得分:0)

将您的架构从普通的 javascript 对象更改为新的“mongoose.Schema()”。

const userSchema = new mongoose.Schema({
  email: String,
  password: String
});

并确保在使用 HTML 正文中指定的任何变量之前正在使用正文解析器。 一个好的做法是在我们初始化应用程序时把它放:

const app = express();
app.use(bodyParser.urlencoded({ extended: true }));enter code here

它可能有助于更改 HTML 表单中的名称,但在我的情况下,它可以正常工作而无需更改 HTML 中的任何部分或架构内的字段