【问题标题】:MongooseJS cannot retrieve data after saving itMongooseJS 保存后无法检索数据
【发布时间】:2015-03-23 14:03:31
【问题描述】:

我有一个简单的 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 方法对用户进行身份验证时,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 }

【问题讨论】:

    标签: node.js mongoose passport.js passport-local


    【解决方案1】:

    Mongoose 正在寻找名为“用户”的集合,但您的数据似乎存储在“用户”中。 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');
           });
         }
        });
    });
    

    【讨论】:

    • 还是不行。插入和检索是在同一个集合上完成的,但是检索没有得到任何数据。
    • 我认为还有其他问题,因为 passport-local-mongoose 没有对密码进行加盐,而是以纯文本形式存储。
    • 尝试使用 mongoose-local 自带的 .register() 方法,我已经更新了答案。
    • 谢谢!它在使用 register() 后工作,但我必须更改架构,因此密码不是必填字段。
    猜你喜欢
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    相关资源
    最近更新 更多