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