Ошибка типа: User.findById не является функцией

#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.findById

3. jcubic; Извините, что ввел так много кода, но я не знаю, в чем ошибка. Я нахожу функцию findById в промежуточном программном обеспечении find_user. Но я добавил другой user.js файл модели — это то, что вы хотите? и большое вам спасибо за ваше внимание

4. Викаш Сингх, спасибо за ответ, я смотрю на то, что вы мне прислали, но не вижу, где я могу это исправить. Если бы вы могли сказать мне немного конкретнее, что я делаю не так? Спасибо за ваше время и терпение.

Ответ №1:

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

Комментарии:

1. Браво, друг, вот и все. Я не хочу вас оскорблять, но если этого нет в документах sequelize, это устарело?? Еще раз, большое вам спасибо, вы вытащили меня из черной дыры. А также большое спасибо 2 другим коллегам, которые помогли. Я проясняю вопрос или оставляю его?

2. Не уверен, что findById устарел — обычно устаревший метод будет работать (и вы получите предупреждающее сообщение). Но теперь это исчезло.