Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript TypeError:user.comparePassword不是函数_Javascript_Node.js_Mongodb_Express - Fatal编程技术网

Javascript TypeError:user.comparePassword不是函数

Javascript TypeError:user.comparePassword不是函数,javascript,node.js,mongodb,express,Javascript,Node.js,Mongodb,Express,我不知道为什么会出现这个错误。TypeError:user.comparePassword不是函数 我安装了所有依赖项。将应用程序链接到所有库。 我试着用邮递员来检索数据,但不起作用。我做错了什么 { "name": "e-commerce", "version": "1.0.0", "description": "", "main": "server.js", "scripts": { "test": "echo \"Error: no test specified

我不知道为什么会出现这个错误。TypeError:user.comparePassword不是函数

我安装了所有依赖项。将应用程序链接到所有库。 我试着用邮递员来检索数据,但不起作用。我做错了什么

{
  "name": "e-commerce",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node server.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "bcrypt-nodejs": "0.0.3",
    "body-parser": "^1.15.2",
    "connect-mongo": "^1.2.1",
    "cookie-parser": "^1.4.3",
    "ejs": "^2.4.2",
    "ejs-mate": "^2.3.0",
    "express": "^4.14.0",
    "express-flash": "0.0.2",
    "express-session": "^1.14.0",
    "mongoose": "^4.5.3",
    "morgan": "^1.7.0",
    "passport": "^0.3.2",
    "passport-local": "^1.0.0"
  }
}


var express = require('express');
var morgan = require('morgan');
var mongoose = require('mongoose');
var bodyParser = require('body-parser');
var ejs = require('ejs');
var engine = require('ejs-mate');
var session = require('express-session');
var cookieParser = require('cookie-parser');
var flash = require('express-flash');
var MongoStore = require('connect-mongo/es5')(session);
var passport = require('passport');



var secret = require('./config/secret');
var User = require("./models/user.js");


var app = express();

mongoose.connect(secret.database, function(err){
  if (err) {
    console.log(err);
  } else {
    console.log("Connected to database");
  }
});
//Middleware
//add how to use static page
app.use(express.static(__dirname + '/public'));
app.use(morgan('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.use(cookieParser());
app.use(session({
  resave: true,
  saveUninitialized: true,
  secret: secret.secretKey,
  store: new MongoStore({url: secret.database, autoReconnect: true})
}));


app.use(flash());
app.use(passport.initialize());
app.use(passport.session());

app.engine('ejs', engine);
app.set('view engine', 'ejs');


var mainRoutes = require('./routes/main');
var userRoutes = require('./routes/user');
app.use(mainRoutes);
app.use(userRoutes);

app.listen(secret.port, function(err){
  if(err) throw err;
  console.log("Server running on port " + secret.port);
});




var passport = require('passport');
var localStrategy = require('passport-local').Strategy;
var User = require('../models/user');


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



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


//middlewear

passport.use('local-login', new localStrategy({
  usernameField: 'email',
  passwordField: 'password',
  passReqToCallback: true
}, function(req, email, password, done){
  User.find({email: email}, function(err, user){
    if (err) return done(err);

    if(!user) {
      return done(null, false, req.flash('loginMessage', 'No user has been found'));
    }

    if(!user.comparePassword(password)){
      return done(null, false, req.flash('loginMessage', 'Opps! Wrong Password Pal'));
    }


    return done(null, user);
  });
}));

//custom function to validate
exports.isAuthenticated = function(req, res, next){
  if( req.isAuthenticated()) {
    return next();
  }
  res.redirect('/login');
};

什么是
。comparePassword

您从
/models/User.js
获得
User
(我假设它是一个mongo模型,但我们看不到),然后调用
.find
(如果它确实是mongo,它应该返回一个数组,对于一个结果,您应该使用
.findOne
)然后在
user
变量中得到结果,并尝试调用某个方法
。comparePassword()
以获得结果,在您的情况下,该结果肯定是
未定义的


尝试在
user.comparePassword
之前添加
console.log(user)
,您将看到您得到的确切信息。

嘿,谢谢您的回复。它返回了这个对象[{u id:57854611fdb264c0512030a7,密码:'$2a$10$KtN9q6sk5uoLaOcNyPeKpuXAAmtBzcN/VqY42K.LspmGWeaeHMTX',电子邮件:'hamster007@gmail.com',_v:0,历史记录:[],档案:{picture:'',name:'仓鼠'}}]这是我为注册输入的用户和信息。当然,是数组。像
.comparePassword
这样的属性或方法将始终是
未定义的
。如果您请求
.findOne
,您将获得object(与数组中的元素相同)。Google search告诉我,您从mongoDB博客示例中获得了这个
。comparePassword
——您可以在mongo模型中真正定义它。或者(我更喜欢这种方法),您可以在验证函数中,甚至在单独的模块中,而不是在模型中定义密码比较函数。只有代码的答案通常可以通过添加对其工作方式和原因的解释来改进。当用公认的答案为旧问题添加答案时,指出你的答案所针对的问题的新方面是很重要的。
  passport.use(new LocalStrategy({
      usernameField:"email",
      passwordField:"password",
      passReqToCallback:true,
 
   },
   function(req,username,password,done){
   User.findOne({
   email:username,
   },function(err,user){
    if(err)
    {   console.log(err);
        return done(err);}
       
        if(!user)
        return done(null,false,{message:"These user is not exits !"});
        user.authenticate(password, function(err,users,passwordError){
            console.log(users);
            if(passwordError){
                console.log(err)
              return  done(null,false,{message:"password is wrong"})
            } else if(users) {
                console.log(`correct password ${users}`)
              return   done(null,users);
               
            }
        })
    })
  }));