0

我有一个简单的 ExpressJS 应用程序,我正在尝试使用护照、护照本地和护照本地猫鼬向它添加用户身份验证,但是在我将用户的数据保存到数据库后,猫鼬无法检索它,尽管我可以看到通过 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 方法对用户进行身份验证时,猫鼬无法在数据库中找到该用户,正如我在猫鼬日志中看到的那样:

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 }
4

1 回答 1

0

Mongoose 正在寻找一个名为“用户”的集合,但看起来您的数据存储在“用户”中。model() 的 API 是 mongoose#model(name, [schema], [collection], [skipInit])。所以你可以通过添加第三个参数来强制集合名称,例如

module.exports = mongoose.model('User', User, 'User');

EDIT1:尝试在 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');
       });
     }
    });
});
于 2015-01-24T19:08:10.687 回答