Я не знаю, почему я получаю эту ошибку. 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');
};
Привет, спасибо, что ответили. Он вернулся этот объект [{_id: 57854611fdb264c0512030a7, пароль: '$ 2a $ 10 $ KtN9q6sk5uoLaOcNyPeKpuXAAmtBzcN/VqY42K.LspmGWeaeHMTX', электронная почта: '[email protected]', __v: 0, история: [], profile: {picture: '', name: 'Hamster'}}] Это пользователь и информация, которые я вводил для регистрации. – spaceDog
Несомненно, это массив. Свойство или метод типа '.comparePassword' всегда будут' undefined'. Если вы запросите '.findOne', вы получите объект (тот же, что и у вас в качестве элемента вашего массива). Поиск в Google показал мне, что вы получили этот «.comparePassword» из примера блога mongoDB - вы либо действительно определили его в своей модели монго. Или (я предпочитаю этот подход), вы можете определить функцию сравнения паролей не в модели, а в вашей функции проверки или даже в отдельном модуле. –
Спасибо! МНОГО! Получил это, чтобы работать. – spaceDog