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());
之后检查您是否在请求期间在表单中提供了username
和password
等两个字段,因为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
)
然后在<form>
标签中修改你的名字属性:
<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