【问题标题】:Passport Local Mongoose Error: No Username Was GivenPassport Local Mongoose 错误:未提供用户名
【发布时间】:2023-03-30 04:19:02
【问题描述】:

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

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

谁能看到我错过了什么?谢谢! :)

【问题讨论】:

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


    【解决方案1】:

    首先,确保在所有路由之前给出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 名称时,例如“email” passport-local 仍希望您的前端登录表单包含名称为 "username" instead of email 的输入字段。这可以配置为本地护照,但这是工作的两倍。所以我们实现了这个快捷方式。

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

    【讨论】:

    • 在您最初定义用户模型的 userSchema 上,您可以修改策略以使用替代登录字段:userSchema.plugin(passportLocalMongoose, { usernameField: 'email' });
    【解决方案2】:

    好的,所以我找到了解决问题的方法——以防其他人遇到同样的问题。

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

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

    【讨论】:

    • 我没有任何 enctype= multipart/form-data 并且对我来说也是如此:(
    • 如果您仍然无法发布一些代码,我会看看是否可以提供帮助。
    • 我很好!刚刚解决了thanx @Runny Yolk,我真的很感谢你的帮助:D它正在调用config.secret的config.secrekey instea并且没有抛出错误:S
    【解决方案3】:

    从 name="email" 更改输入“name”属性值 名称=“用户名” 这可以解决它

    【讨论】:

      【解决方案4】:

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

      我遇到了和我失踪一样的问题

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

      【讨论】:

        【解决方案5】:

        我找到了解决办法。

        像这样改变你的架构结构:

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

        然后在&lt;form&gt;标签中修改你的名字属性:

        <input name="username" />
        

        【讨论】:

          【解决方案6】:

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

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

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

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

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

          【讨论】:

            【解决方案7】:

            虽然创建新用户不需要创建变量 newUser 你可以直接这样做

            //New user creation
            app.post('/newuser', function(req, res){
              User.register({username: req.body.email}, 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');
                });
              }); 
            });
            

            【讨论】:

              猜你喜欢
              • 2018-11-07
              • 2018-07-27
              • 2013-07-23
              • 1970-01-01
              • 1970-01-01
              • 2014-07-21
              • 1970-01-01
              • 2021-08-15
              • 1970-01-01
              相关资源
              最近更新 更多