Ошибка типа: user.findOne не является функцией в моей модели - PullRequest
1 голос
/ 21 января 2020

Я создаю API в nodejs с Express и Sequelize.

У меня есть модель , называемая пользователи , контроллер named UserController и маршрутизатор с именем apiRouter

Когда я пытаюсь использовать метод findOne в модели моего пользователя I получить эту ошибку:

 TypeError: user.findOne is not a function
        at register (C:\Users\romain\Desktop\T-WEB-700\routes\usersController.js:52:14)
        at Layer.handle [as handle_request] (C:\Users\romain\Desktop\T-WEB-700\node_modules\express\lib\router\layer.js:95:5)
        at next (C:\Users\romain\Desktop\T-WEB-700\node_modules\express\lib\router\route.js:137:13)
        at Route.dispatch (C:\Users\romain\Desktop\T-WEB-700\node_modules\express\lib\router\route.js:112:3)
        at Layer.handle [as handle_request] (C:\Users\romain\Desktop\T-WEB-700\node_modules\express\lib\router\layer.js:95:5)
        at C:\Users\romain\Desktop\T-WEB-700\node_modules\express\lib\router\index.js:281:22
        at Function.process_params (C:\Users\romain\Desktop\T-WEB-700\node_modules\express\lib\router\index.js:335:12)
        at next (C:\Users\romain\Desktop\T-WEB-700\node_modules\express\lib\router\index.js:275:10)
        at Function.handle (C:\Users\romain\Desktop\T-WEB-700\node_modules\express\lib\router\index.js:174:3)
        at router (C:\Users\romain\Desktop\T-WEB-700\node_modules\express\lib\router\index.js:47:12)

Вот моя модель:

module.exports = (sequelize, DataTypes) => {
  var users = sequelize.define('Users', {
     user_key_id: DataTypes.CHAR(30),
     name: DataTypes.CHAR,
     surname: DataTypes.CHAR,
     email: DataTypes.CHAR,
     encrypted_password: DataTypes.CHAR,
     email_verification_token: DataTypes.CHAR,
     email_verification_status: DataTypes.BOOLEAN,
   }, {});
   users.associate = function(models) {
     // associations can be defined here
     users.hasMany(models.currency_user);
     users.hasMany(models.user_feed);
     users.hasMany(models.user_role);
     users.hasOne(models.roles);
   };

   return users;
 };

здесь мой контроллер:

var bcrypt = require('bcrypt')
var jwt = require('jsonwebtoken')
var user = require('../models').users

function makeid() {
    var isUnique = false
    var count = 0
    var result           = '';
    var characters       = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789,?;.:/!§ù%$^¨*µ#';
    var charactersLength = 30;
    while(isUnique != true)
    {
      for ( var i = 0; i < 30; i++ ) {
        result += characters.charAt(Math.floor(Math.random() * charactersLength));
      }

      return user.find({
        where: {
           id: userDeviceId
        }
     }).then(function(device) {
        if (!device) {
            isUnique = true
        }
        else if(count > 1000000000)
        {
            return false
        }
     })
     .catch(function(error) {
       return false
     })



    }
    return result;
  }

module.exports = {
    register: function(req, res) {
        var name = req.body.name
        var surname = req.body.surname
        var password = req.body.password
        var email = req.body.email

        if(email == null || name == null || surname == null || password == null)
        {
            return res.status(400).json({ 'error': 'Missing parameters !' })
        }

        user.findOne({
            attributes: ['email'],
            where: {email: email}
        })
        .then(function(userFound) {
            if(!userFound)
            {
                var key = makeid()

                if(key == false)
                    return res.status(500).json({ 'error': 'Cannot generate unique key ! (no slots or too much attempt !)'})
                bcrypt.hash(password, 5, function( err, pwd) {
                    var newUser = models.users.create({
                        email: email,
                        user_key_id: key,
                        name: name,
                        surname: surname,
                        password: pwd
                    })
                    var newRoleForUser = models.user_role.create({
                        role_id: ',E<i8€?G7Lfm37µCµ96ZGr42b_mhfP',
                        user_id: key
                    })
                })

            } else
            {
                return res.status(409).json({ 'error': 'User already exist !'})
            }
        })
        .catch(function(err) {
            return res.status(500).json({ 'error': 'Unable to verify user !'})
        })
    },

    login: function(req, res) {
        var password = req.body.password
        var email = req.body.email
        if(password == null || email == null)
        {
            return res.status(400).json({ 'error': 'Missing parameters !' })
        }
    }
}

и вот мой роутер:

const express = require('express')
const userControl = require('./routes/usersController')

exports.router = (function() {
    var apiRouter = express.Router()

    apiRouter.route('/users/register/').post(userControl.register)
    apiRouter.route('/users/login/').post(userControl.login)

    return apiRouter
})()

Некоторое время я ищу ошибку в документации и форумах, но не могу найти решения.

Это мой первый пост о переполнении стека, поэтому, если у вас есть какие-либо советы, чтобы сделать мои посты красивее, я буду очень признателен.

Заранее спасибо:)

1 Ответ

0 голосов
/ 22 января 2020

Кажется, что в вашем классе модели вы экспортируете некоторую функцию с 2 параметрами вместо модели. Как насчет этого:

const Sequelize = require('sequelize')

const sequelize = new Sequelize()

var users = sequelize.define('Users', {
 user_key_id: DataTypes.CHAR(30),
 name: DataTypes.CHAR,
 surname: DataTypes.CHAR,
 email: DataTypes.CHAR,
 encrypted_password: DataTypes.CHAR,
 email_verification_token: DataTypes.CHAR,
 email_verification_status: DataTypes.BOOLEAN,
}, {});
users.associate = function(models) {
 // associations can be defined here
 users.hasMany(models.currency_user);
 users.hasMany(models.user_feed);
 users.hasMany(models.user_role);
   users.hasOne(models.roles);
 };

module.exports = users;

?

...