"error": "Cannot read property 'findOne' of undefined"

"error": "Cannot read property 'findOne' of undefined"

大家好!! 在这里我有一个大问题,我想在后面用 Node.js sequelize 和 mySql 进行注册。 我到处看了看,但没有找到问题的答案,所以我来向您寻求帮助。 使用 mongoDb,这更容易,但我承认我在兜圈子。

这是我的代码:

// Importation :

// Bcrypt:
const bcrypt = require("bcrypt");

// Jsonwebtoken d'authentification:
const jwt = require("jsonwebtoken");

// Import du models user:
const models = require("../models/user")

//////////////////////////////////////////////////////////////////////////////////////////////
// Fonction/

// Incription:
exports.signup = (req, res) => {

  const username  = req.body.username;
  const email     = req.body.email;
  const password  = req.body.password;
  const bio       = req.body.bio;
  const admin     = req.body.admin;

  console.log(req.body)
  try {

    models.User.findOne({
      attributes: ['email'],
      where: {
        email: email
      }
    })

    .then((userFound => {
      if (!userFound) {

        bcrypt.hash(password, 10, function (err, bcryptPassword) {

          const newUser = models.User.create({
            username  : username,
            email     : email,
            password  : bcryptPassword,
            bio       : bio,
            admin     : false
            })

            .then(newUser => {
              res.status(201).json({
                'userId': newUser.id
              })
            })
            .catch(err => {
              res.status(500).json({
                'error': 'Impossible d\'ajouter un utilisateur'
              })
            })

          })

        } else {
          return res.status(409).json({
            error: 'Ce compte existe déjà '
          })
        }

      })
      .catch((err) =>
        res.status(500).json({
          'err': err + 'Impossible de vérifier l\'utilisateur',
        })
      )

      )
  }catch (error) {
    res.status(400).json({
      error: error.message
    });
  }

}

模型用户:

'use strict'
const { db } = require('../config/connexion')

const { Sequelize, DataTypes } = require('sequelize')

const user = db.define('User', {
  // Model attributes are defined here
  username: DataTypes.STRING,
  email: DataTypes.STRING,
  password: DataTypes.STRING,
  bio: DataTypes.TEXT,
  admin: DataTypes.BOOLEAN,
})

module.exports = user

和connexion.js:

// Connexion de sequelize à mysql:
const {
  Sequelize
} = require('sequelize')

const db = new Sequelize(
  process.env.NAMEDB,
  process.env.USERDB,
  process.env.PASSWORDDB, {
    host: process.env.HOSTDB,
    dialect: process.env.DIALECTDB,
    pool: {
      min: 0, //  nombre minimum de connexion dans le pool
      max: 5, //  nombre maximum de connexion dans le pool
      acquire: 30000, //  durée maximale, en millisecondes, pendant laquelle ce pool essaiera d'obtenir la connexion avant de lancer une erreur
      idle: 10000, //  temps maximum, en millisecondes, pendant lequel une connexion peut être inactive avant d'être libérée
    },
  }
)

//////////////////////////////////////////////////////////////////////////////////////////////
// Etablit la connexion à mysql:
const dbConnect = async (db) => {
  await db
    .authenticate()
    .then(() => {
      db.sync()
      console.log('Connecté à la base de données MySQL!')
    })
    .catch((err) => {
      console.error('error: ' + err.message)
      setTimeout(() => {
        dbConnection(db)
      }, 5000)
    })
}

//////////////////////////////////////////////////////////////////////////////////////////////
// Exportation:
module.exports = {
  db,
  dbConnect,
}

当然还有很多事情要做,但作为一个初学者,我会不断进步。

如果我的英语不是最好的,不要生我的气,我承认这不是我的强项。

提前感谢您提供的所有帮助。

检查您的“模型”文件,看看那里是否存在“用户”模型。还要检查您是否使用 'module.exports'

您正在直接导出 User 模型,但调用它就像在名为 User 的对象 属性 中一样。您可以直接访问它,更改:

models.User.findOne

至:

models.findOne

然后您可能想将 models 重命名为 User

将导出更改为:

module.exports = { User: user };

您直接将导出对象设置为等于用户对象。

当你这样做 const models = require("../models/user") 时,models 直接等于 user 值。

可以直接使用models.findOne。阅读 this

您正在将 user 变量设置为导出文件

module.exports = user

然后将 user 变量导入为 models

const models = require("../models/user")

这意味着您不需要像 属性 一样访问 user。而是使用:

models.findOne({ // Changed from models.User to models
    attributes: ["email"],
    where: {
        email: email,
    },
});

这应该会阻止您当前的错误,但您将继续收到错误,直到您将 models.User 的所有实例更改为 models

您的主文件最终应如下所示:

// Importation :

// Bcrypt:
const bcrypt = require("bcrypt");

// Jsonwebtoken d'authentification:
const jwt = require("jsonwebtoken");

// Import du models user:
const models = require("../models/user");

//////////////////////////////////////////////////////////////////////////////////////////////
// Fonction/

// Incription:
exports.signup = (req, res) => {
  const username = req.body.username;
  const email = req.body.email;
  const password = req.body.password;
  const bio = req.body.bio;
  const admin = req.body.admin;

  console.log(req.body);
  try {
    models
      .findOne({
        attributes: ["email"],
        where: {
          email: email,
        },
      })

      .then(
        ((userFound) => {
          if (!userFound) {
            bcrypt.hash(password, 10, function (err, bcryptPassword) {
              const newUser = models
                .create({
                  username: username,
                  email: email,
                  password: bcryptPassword,
                  bio: bio,
                  admin: false,
                })

                .then((newUser) => {
                  res.status(201).json({
                    userId: newUser.id,
                  });
                })
                .catch((err) => {
                  res.status(500).json({
                    error: "Impossible d'ajouter un utilisateur",
                  });
                });
            });
          } else {
            return res.status(409).json({
              error: "Ce compte existe déjà ",
            });
          }
        }).catch((err) =>
          res.status(500).json({
            err: err + "Impossible de vérifier l'utilisateur",
          })
        )
      );
  } catch (error) {
    res.status(400).json({
      error: error.message,
    });
  }
};