"error": "无法读取未定义的属性 'findOne'"

问题描述

大家好!! 这里我有一个大问题,我想用 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
    });
  }

}

response from Postman's console

和模型用户

'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,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,}

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

如果我的英文没有达到顶峰,请不要生我的气,我承认这不是我的强项。

预先感谢您提供的所有帮助。

解决方法

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

执行此操作时 const models = require("../models/user")models 直接等于 user 值。

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

,

检查您的“模型”文件以查看其中是否存在“用户”模型。还要检查您是否正在使用“module.exports”

,

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

models.User.findOne

到:

models.findOne

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

将您的导出更改为:

module.exports = { User: user };
,

您正在将 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,});
  }
};