2016-07-12 3 views
0

Я не знаю, почему я получаю эту ошибку. TypeError: user.comparePassword не является функцией.ТипError: user.comparePassword не является функцией

Я установил все зависимости. Связал APP со всеми библиотеками. Я пытался использовать Postman для извлечения данных, но он не работает. Что я делаю не так?

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

ответ

1

Что именно такое .comparePassword?

Вы User из ./models/user.js (я предполагаю, что это модель Монго, но мы не можем видеть это), то вы звоните .find (если это действительно Монго он должен вернуть вам массив, на один результат, вы должны использовать .findOne), а затем вы получаете свой результат в user переменных и попытаться вызвать некоторый метод .comparePassword() для вашего результата, что в вашем случае это определенно undefined ...

попробуйте добавить console.log(user) перед тем user.comparePassword, и вы увидите, что именно вы получите.

+0

Привет, спасибо, что ответили. Он вернулся этот объект [{_id: 57854611fdb264c0512030a7, пароль: '$ 2a $ 10 $ KtN9q6sk5uoLaOcNyPeKpuXAAmtBzcN/VqY42K.LspmGWeaeHMTX', электронная почта: '[email protected]', __v: 0, история: [], profile: {picture: '', name: 'Hamster'}}] Это пользователь и информация, которые я вводил для регистрации. – spaceDog

+0

Несомненно, это массив. Свойство или метод типа '.comparePassword' всегда будут' undefined'. Если вы запросите '.findOne', вы получите объект (тот же, что и у вас в качестве элемента вашего массива). Поиск в Google показал мне, что вы получили этот «.comparePassword» из примера блога mongoDB - вы либо действительно определили его в своей модели монго. Или (я предпочитаю этот подход), вы можете определить функцию сравнения паролей не в модели, а в вашей функции проверки или даже в отдельном модуле. –

+1

Спасибо! МНОГО! Получил это, чтобы работать. – spaceDog

Смежные вопросы