Passport Local Mongoose 错误:未提供用户名

Posted

技术标签:

【中文标题】Passport Local Mongoose 错误:未提供用户名【英文标题】:Passport Local Mongoose Error: No Username Was Given 【发布时间】:2017-02-02 09:31:39 【问题描述】:

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

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

【问题讨论】:

【参考方案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');
    );
  ); 
);

【讨论】:

以上是关于Passport Local Mongoose 错误:未提供用户名的主要内容,如果未能解决你的问题,请参考以下文章

找到一种使用 passport-local-mongoose 更新用户护照的方法

Passport local auth plus passport mongoose local 不接受电子邮件作为用户名

Passport Local Mongoose 错误:未提供用户名

Passport-local mongoose node.js 支持多种用户类型

Node + Express + Passport + Mongoose:req.user 未定义

如何在 Mongoose 中更新/更新文档/数据? Passport MongoDB、Express、AngularJS、Nodejs