我有一个快速应用程序,我正在尝试添加护照本地猫鼬的用户,但每当我尝试创建用户时,我都会收到错误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]]
任何人都能看到我错过的东西吗?谢谢! :)
答案 0 :(得分:2)
首先,确保在所有路线之前提供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名称时,例如&#34; email&#34; passport-local仍然希望您的前端登录表单包含名为
"username" instead of email
的输入字段。这可以配置为本地护照,但这是工作的两倍。所以我们实现了这个快捷方式。
答案 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 中的任何部分或架构内的字段