我在用Node.js+Express+Passport创建简单身份验证(本地)

到目前为止,当输入错误的用户名或密码时,用户会被重定向到错误页面

但当用户输入正确的用户名和密码时,我会出现这个错误

node_modules\mongoose\lib\utils.js:435
    throw err;
          ^
TypeError: Object { _id: 50b347decfd61ab9e9e6768f,
username: 'saleh',
password: '123456' } has no method 'validPassword'

我不确定那里出了什么问题

应用程序.js(我删除了不必要的代码):

  var passport = require('passport')
  , LocalStrategy = require('passport-local').Strategy;

  app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'ejs');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(passport.initialize());
  app.use(passport.session());
  app.use(app.router);
  app.use(express.static(path.join(__dirname, 'public')));
});



var mongoose = require('mongoose');
var db = mongoose.createConnection('localhost', 'authTest');

var authSchema = mongoose.Schema({ 
  username: 'string',
  password: 'string'
});

var User = db.model('users', authSchema);


passport.use(new LocalStrategy(
  function(username, password, done) {
    User.findOne({ username: username }, function (err, user) {
      if (err) { return done(err); }
      if (!user) {
        return done(null, false, { message: 'Incorrect username.' });
      }
      if (!user.validPassword(password)) {
        return done(null, false, { message: 'Incorrect password.' });
      }
      return done(null, user);
    });
  }
));



passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
  });
});




app.post('/login',
  passport.authenticate('local', { successRedirect: '/',
                                   failureRedirect: '/login/error',

                                  })
);

现在进入路由/登录.js

var mongoose = require('mongoose');
var db = mongoose.createConnection('localhost', 'authTest');

var authSchema = mongoose.Schema({ 
    username: 'string',
    password: 'string'
});

var User = db.model('users', authSchema);

exports.index = function(req, res){
User.find(function (err, list) {
        res.render('login', { title: 'Usernames and Passwords', users: list,msg:""});
    });
};

谢谢你抽出时间.

推荐答案

你正在使用

if (!user.validPassword(password)) {
    return done(null, false, { message: 'Incorrect password.' });
}

但你还没有定义validPassword方法.将其附加到您的模式:

var authSchema = mongoose.Schema({ 
    username: 'string',
    password: 'string'
});
authSchema.methods.validPassword = function( pwd ) {
    // EXAMPLE CODE!
    return ( this.password === pwd );
};

EDIT您还错误地定义了模式.应该是:

var authSchema = mongoose.Schema({ 
    username: String,
    password: String
});

注意,usernamepassword都应该是String类型的对象,而不是字符串"string",如果你知道我的意思的话.:)

Mongodb相关问答推荐

从MongoDB中的一个非空字段获取值

找到一个用户,然后使用 MongoDB 根据他们的总分获得他们的排名

根据状态过滤 mongoDb 中的结果

Nestjs中不同语言数据的mongodb聚合代码

增加嵌套对象中的值?

带有 mongodb 和 nodejs 的实时 Web 应用程序

mongodb 模式设计命名约定

如何更新 mongodb 文档以向数组添加新元素?

使用 brew upgrade Mongo update from 3.4 to 4.0 报错:在try 升级到 4.0 之前,数据文件需要完全升级到 3.6 版

ExpressJS & Mongoose REST API struct :最佳实践?

如何解决 ClassNotFoundException:com.mongodb.connection.BufferProvider?

有没有办法将python对象直接存储在mongoDB中而不序列化它们

如何在mongodb中删除数组的第n个元素

MongoDB 嵌套 OR/AND 在哪里?

Mongo: query by key one level deep

C# MongoDB 驱动程序 - 如何使用 UpdateDefinitionBuilder?

Java + MongoDB:更新文档中的多个字段

获取 mongodb 中所有唯一标签的列表

如何在 golang 和 mongodb 中通过 id 查找

mongo中的稀疏索引和空值