2016-07-12 9 views
0

Ich weiß nicht, warum ich diesen Fehler bekomme. TypeError: user.comparePassword ist keine Funktion.TypeError: user.comparePassword ist keine Funktion

Ich habe alle Abhängigkeiten installiert. Verknüpft die APP mit allen Bibliotheken. Ich habe versucht, Postman zu verwenden, um die Daten abzurufen, aber es funktioniert nicht. Was mache ich falsch?

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

Antwort

1

Was genau ist .comparePassword?

Sie erhalten User von ./models/user.js (Ich nehme an, es ist ein Mongo Modell, aber wir können es nicht sehen), Sie .find rufen Sie dann (wenn es wirklich Mongo es sollten Sie ein Array zurück, für ein Ergebnis sollten Sie .findOne verwenden) und dann Sie Ihr Ergebnis in user Variable und versuchen, eine Methode .comparePassword() für Ihr Ergebnis zu rufen, dass auf jeden Fall in Ihrem Fall undefined ...

Try console.log(user) hinzufügen, bevor user.comparePassword ist und Sie werden sehen, genau das, was man bekommt.

+0

Hey Danke für Ihre Antwort. Er kehrte dieses Objekt [{_id: 57854611fdb264c0512030a7, Passwort: '2a $ 10 $ $ KtN9q6sk5uoLaOcNyPeKpuXAAmtBzcN/VqY42K.LspmGWeaeHMTX', email: '[email protected]', __v: 0, Geschichte: [], Profil: {Bild: '', Name: 'Hamster'}}] Das sind die Benutzer und Informationen, die ich für die Anmeldung eingegeben habe. – spaceDog

+0

Sicher, es ist Array. Eine Eigenschaft oder Methode wie '.comparePassword' wird immer 'undefiniert' sein. Wenn Sie '.findOne' anfordern, erhalten Sie ein Objekt (dasselbe, das Sie als Element Ihres Arrays haben). Google Suche zeigte mir, dass Sie dieses '.comparePassword' aus dem mongoDB Blog-Beispiel bekommen haben - Sie haben es entweder wirklich in Ihrem Mongo-Modell definiert. Oder (ich bevorzuge diesen Ansatz) Sie könnten Ihre Passwortkomparationsfunktion nicht im Modell, sondern in Ihrer Validierungsfunktion oder sogar in einem separaten Modul definieren. –

+1

Danke! VIEL! Habe es zur Arbeit gebracht. – spaceDog