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');
};
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
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. –
Danke! VIEL! Habe es zur Arbeit gebracht. – spaceDog