#javascript #backend
#javascript #серверная часть
Вопрос:
Я рассказываю вам о своей проблеме. Я нахожусь на своем первом сервере; Войдите в систему нормально, но при попытке передать представление в index.pug я получаю эту ошибку. Ошибка типа: 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;
и мой sessions_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 AndresProgramacionBackEndProyecto3base_datosmiddlewaresfind_user.js:7:8)
at Layer.handle [as handle_request] (F:Documentos AndresProgramacionBackEndProyecto3base_datosnode_modulesexpresslibrouterlayer.js:95:5)
at trim_prefix (F:Documentos AndresProgramacionBackEndProyecto3base_datosnode_modulesexpresslibrouterindex.js:317:13)
at F:Documentos AndresProgramacionBackEndProyecto3base_datosnode_modulesexpresslibrouterindex.js:284:7
at Function.process_params (F:Documentos AndresProgramacionBackEndProyecto3base_datosnode_modulesexpresslibrouterindex.js:335:12)
at next (F:Documentos AndresProgramacionBackEndProyecto3base_datosnode_modulesexpresslibrouterindex.js:275:10)
at Immediate._onImmediate (F:Documentos AndresProgramacionBackEndProyecto3base_datosnode_modulesexpress-sessionindex.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;
};
Комментарии:
1. Вы добавили много кода, но самое важное отсутствует, можете ли вы показать, как ваш
models.js
выглядит? тот, у которого естьfindById
функция?2.
findById
не возвращайте обещание, вместо этого попробуйте с обратным вызовом. Смотрите здесь mongoosejs.com/docs/api.html#model_Model.findById3. jcubic; Извините, что ввел так много кода, но я не знаю, в чем ошибка. Я нахожу функцию findById в промежуточном программном обеспечении find_user. Но я добавил другой user.js файл модели — это то, что вы хотите? и большое вам спасибо за ваше внимание
4. Викаш Сингх, спасибо за ответ, я смотрю на то, что вы мне прислали, но не вижу, где я могу это исправить. Если бы вы могли сказать мне немного конкретнее, что я делаю не так? Спасибо за ваше время и терпение.
Ответ №1:
Попробуйте использовать findByPk, а не findById (я не могу найти findById в документах sequelize).
Комментарии:
1. Браво, друг, вот и все. Я не хочу вас оскорблять, но если этого нет в документах sequelize, это устарело?? Еще раз, большое вам спасибо, вы вытащили меня из черной дыры. А также большое спасибо 2 другим коллегам, которые помогли. Я проясняю вопрос или оставляю его?
2. Не уверен, что findById устарел — обычно устаревший метод будет работать (и вы получите предупреждающее сообщение). Но теперь это исчезло.