Ошибка типа: User.findById не является функцией - PullRequest
1 голос
/ 04 апреля 2019

Я говорю вам мою проблему. Я с моим первым сервером; Войдите в систему нормально, но при попытке передать представление 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;
};

1 Ответ

1 голос
/ 04 апреля 2019

Попробуйте использовать findByPk , а не findById (я не могу найти findById в документах sequelize).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...