Я говорю вам мою проблему. Я с моим первым сервером; Войдите в систему нормально, но при попытке передать представление index.pug я получаю эту ошибку.
TypeError: User.findById не является функцией
Я тщательно пересмотрел код, нашел какую-то ошибку и решил ее, ... я думаю. Программа начинает сеанс и возвращает мне JSON, когда она зарегистрирована и аутентифицирована в bbdd.
Это мое промежуточное ПО middlewares / find_user.js
const User = require('../models').User;//Modelo User
module.exports = function(req,res,next){
if(!req.session.userId) return next(); //Sí userId no existe next.
User.findById(req.session.userId).then(user=>{
if(user){//Sí user existe,
req.user = user;//meter valor de user en req.user, para que lo usen otros middleware.
next();//next al siguiente middleware.
}
})
};
Это мои sessions.js контроллеры
const User = require('../models').User;//importamos el modelo user.js
module.exports = {
new: function(req,res){//despliega el formulario de autenticacion
res.render('sessions/new');//renderiza la vista sessions/new.pug.
},//en lin 5:new debe coincidir el nombre con la vista y la acccion.
create: function(req,res){//recibe los datos del formulario para crear-
// la sesion y hacer el Login.
User.login(req.body.email, req.body.password)
.then(user => {
if(user){//si hay usuario guardamos la sesion.
req.session.userId = user.id;//guardar el id del user en una sesion user.Id
//de la sesion UserId
}
res.json(user);
})
.catch(err=>{
console.log(err);
res.json(err);
})
}
};
Это мой registrations.js контроллер
new: function(req,res){
res.render('registrations/new');
},
create: function(req,res){
let data = {
email: req.body.email,
password: req.body.password
};
User.create(data).then(result=>{
res.json(result);
}).catch(err=>{
res.json(err);
});
}
};
Только на всякий случай;
Мой registrations_routes.js :
const express = require('express');//importamos express.
let RegistrationsController = require('../controllers/registrations.js');
let router = express.Router();//metemos en el objeto router el metodo Router de express.
router.get('/signup',RegistrationsController.new);//ruta crear un nuevo registro/usuario.
router.route('/users').post(RegistrationsController.create);
module.exports = router;
и мои session_routes.js :
const express = require('express');//importamos express
let SessionsController = require('../controllers/sessions');//importa el-
// controlador de sessions.js
var router = express.Router();//metemos en el objeto JSON router, el metodo-
// Router de express.
router.route('/sessions')
.get(SessionsController.new)//peticion GET.
.post(SessionsController.create);//peticion POST.
module.exports = router;//exportamos router para poder montarlo en la aplicacion.
Мое намерение состоит в том, чтобы иметь возможность перенаправить в представление "/", и чтобы при входе в систему я получал эту ошибку, появляется сообщение пользователя, который вошел в систему.
Спасибо вам большое за все.
Это мой файл ошибок
at module.exports (F:\Documentos Andres\Programacion\BackEnd\Proyecto3\base_datos\middlewares\find_user.js:7:8)
at Layer.handle [as handle_request] (F:\Documentos Andres\Programacion\BackEnd\Proyecto3\base_datos\node_modules\express\lib\router\layer.js:95:5)
at trim_prefix (F:\Documentos Andres\Programacion\BackEnd\Proyecto3\base_datos\node_modules\express\lib\router\index.js:317:13)
at F:\Documentos Andres\Programacion\BackEnd\Proyecto3\base_datos\node_modules\express\lib\router\index.js:284:7
at Function.process_params (F:\Documentos Andres\Programacion\BackEnd\Proyecto3\base_datos\node_modules\express\lib\router\index.js:335:12)
at next (F:\Documentos Andres\Programacion\BackEnd\Proyecto3\base_datos\node_modules\express\lib\router\index.js:275:10)
at Immediate._onImmediate (F:\Documentos Andres\Programacion\BackEnd\Proyecto3\base_datos\node_modules\express-session\index.js:489:7)
at runCallback (timers.js:706:11)
at tryOnImmediate (timers.js:676:5)
at processImmediate (timers.js:658:5)
Моя модель user.js :
'use strict';
const bcrypt =require('bcrypt');
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define('User', {//Modelo de tabla users.
email: {
type: DataTypes.STRING,
unique: true,//validacion, solo un igual en bbdd
allowNull: false//no permite que se quede vacio
},
password_hash: DataTypes.STRING,//Pass encriptado a string.
password: DataTypes.VIRTUAL//pass sin encriptar a memoria virtual.
}, {});
User.login = function(email,password){//funcion login de User que busca un registro y lo almacena en login
return User.findOne({//busca uno en concreto.
where: {
email: email//En campo email bucar el email dado. O "email" por shorthand propertys.
}
}).then(user=>{
if(!user) return null;//si no existe el usuario en bbdd devuelve nulo.
return user.authenticatePassword(password).then(valid=> valid ? user : null);//o tambien ".then(valid=> valid ? user : null);"
});
};
User.prototype.authenticatePassword = function(password){//compara el pass dado y el hash de la bbdd.
return new Promise((res,rej)=>{//devuelve promesa.
bcrypt.compare(password,this.password_hash,function(err,valid){//compara , si ok valid, sí nok err.
if(err){return rej(err);} //no coincide hash de bbdd con pass dado =>err
res(valid);//sí coincide hash de bbd con pass dado =>valid.
})
})
};
User.associate = function(models) {
// associations can be defined here
};
User.beforeCreate(function(user,options){//Antes de guardar encriptar.
return new Promise((res,rej)=>{//retorna una promesa
if(user.password){//si se introduce un pass.
bcrypt.hash(user.password, 10, function(error,hash){//algoritmo de encriptacion
user.password_hash = hash;//se guarda el pass encriptado.
res();//con esto decimos que ha ido bien, Para continuar
})
};
});
});
return User;
};