MongooseJS 保存后无法检索数据
MongooseJS cannot retrieve data after saving it
我有一个简单的 ExpressJS 应用程序,我正在尝试使用 passport、passport-local 和 passport-local-mongoose 添加用户身份验证,但是在我将用户数据保存到数据库后, mongoose 检索失败,虽然我可以通过 mongo cli 查看数据。
在主快递模块我有:
// Passport session setup.
var User = require("./models/user");
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
我的用户模型模块有:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var passportLocalMongoose = require('passport-local-mongoose');
// User Schema
var User = new Schema({
username: { type: String, required: true, unique: true },
password: { type: String, required: true}
});
User.plugin(passportLocalMongoose);
module.exports = mongoose.model('User', User);
在我的路由模块中,我使用以下代码创建了一个用户:
router.post('/register', function(req, res) {
var u = req.body.username;
var p = req.body.password;
console.log('Creating account for ' + u + ':' + p);
// Store client on DB
var usr = new User({ username: u, password: p });
usr.save(function(err) {
if(err) {
console.log(err);
return res.render('register', {title: 'Register', error: err.userMessage});
} else {
console.log('user: ' + usr.username + " saved.");
passport.authenticate('local')(req, res, function () {
return res.redirect('/dashboard');
});
}
});
});
但是当我尝试使用 passport.authenticate 方法对用户进行身份验证时,mongoose 无法在数据库中找到该用户,正如我在 mongoose 日志中看到的那样:
Login request @ 1422120637815
Mongoose: users.findOne({ username: 'e@e.com' }) { fields: undefined }
但是在 mongo cli 我可以看到数据:
> db.User.find()
{ "username" : "e@e.com", "password" : "123", "_id" : ObjectId("54c3d688fc71a4001db30612"), "__v" : 0 }
Mongoose 正在寻找名为 'users' 的集合,但您的数据似乎存储在 'User' 中。 model() 的 API 是 mongoose#model(name, [schema], [collection], [skipInit])。所以你可以通过添加第三个参数来强制集合名称,例如
module.exports = mongoose.model('User', User, 'User');
编辑1:
尝试在 mongoose-local
中使用内置的 register() 方法
router.post('/register', function(req, res) {
var u = req.body.username;
var p = req.body.password;
console.log('Creating account for ' + u + ':' + p);
// Store client on DB
Account.register(new Account({ username: req.body.username }), req.body.password, function(err) {
if(err) {
console.log(err);
return res.render('register', {title: 'Register', error: err.userMessage});
} else {
passport.authenticate('local')(req, res, function () {
return res.redirect('/dashboard');
});
}
});
});
我有一个简单的 ExpressJS 应用程序,我正在尝试使用 passport、passport-local 和 passport-local-mongoose 添加用户身份验证,但是在我将用户数据保存到数据库后, mongoose 检索失败,虽然我可以通过 mongo cli 查看数据。
在主快递模块我有:
// Passport session setup.
var User = require("./models/user");
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
我的用户模型模块有:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var passportLocalMongoose = require('passport-local-mongoose');
// User Schema
var User = new Schema({
username: { type: String, required: true, unique: true },
password: { type: String, required: true}
});
User.plugin(passportLocalMongoose);
module.exports = mongoose.model('User', User);
在我的路由模块中,我使用以下代码创建了一个用户:
router.post('/register', function(req, res) {
var u = req.body.username;
var p = req.body.password;
console.log('Creating account for ' + u + ':' + p);
// Store client on DB
var usr = new User({ username: u, password: p });
usr.save(function(err) {
if(err) {
console.log(err);
return res.render('register', {title: 'Register', error: err.userMessage});
} else {
console.log('user: ' + usr.username + " saved.");
passport.authenticate('local')(req, res, function () {
return res.redirect('/dashboard');
});
}
});
});
但是当我尝试使用 passport.authenticate 方法对用户进行身份验证时,mongoose 无法在数据库中找到该用户,正如我在 mongoose 日志中看到的那样:
Login request @ 1422120637815
Mongoose: users.findOne({ username: 'e@e.com' }) { fields: undefined }
但是在 mongo cli 我可以看到数据:
> db.User.find()
{ "username" : "e@e.com", "password" : "123", "_id" : ObjectId("54c3d688fc71a4001db30612"), "__v" : 0 }
Mongoose 正在寻找名为 'users' 的集合,但您的数据似乎存储在 'User' 中。 model() 的 API 是 mongoose#model(name, [schema], [collection], [skipInit])。所以你可以通过添加第三个参数来强制集合名称,例如
module.exports = mongoose.model('User', User, 'User');
编辑1: 尝试在 mongoose-local
中使用内置的 register() 方法router.post('/register', function(req, res) {
var u = req.body.username;
var p = req.body.password;
console.log('Creating account for ' + u + ':' + p);
// Store client on DB
Account.register(new Account({ username: req.body.username }), req.body.password, function(err) {
if(err) {
console.log(err);
return res.render('register', {title: 'Register', error: err.userMessage});
} else {
passport.authenticate('local')(req, res, function () {
return res.redirect('/dashboard');
});
}
});
});