【问题标题】:Cannot read property 'create' of undefined in expressjs无法读取 expressjs 中未定义的属性“创建”
【发布时间】:2021-05-16 21:30:19
【问题描述】:

请是 Nodejs 的新手,但我正在尝试使用 sequelize 将数据插入我的数据库,但我收到无法读取属性 .create of undefined。

这是我的 index.js 文件

const fs = require('fs')
const path = require('path')
const Sequelize = require('sequelize')
const config = require('../config/config')

const db = {}

const sequelize = new Sequelize(
config.DB,
config.USER,
config.PASSWORD,
{
  host: config.HOST,
  dialect: config.dialect,
  operatorsAliases: false,

  pool: {
    max: config.pool.max,
    min: config.pool.min,
    acquire: config.pool.acquire,
    idle: config.pool.idle
  }
});
fs
  .readdirSync(__dirname)
  .filter((file) =>
file !== 'index.js'
)

.forEach((file) => {
    const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes)
    // db[model] = model
    db.User = model
})
db.sequelize = sequelize
db.Sequelize = Sequelize

module.exports = db;

这是我的 Model/User.js 文件

module.exports = (sequelize, DataTypes) => {
sequelize.define('User', {
    hmtec_email: {
        type: DataTypes.STRING,
        unique: true
    },
    hmtec_password: DataTypes.STRING
})

这是我的 Controllers/AuthController.js 文件

const {User} = require ('../models/User')
module.exports = {
async register (req, res) {
    try {
        const user = await User.create(req.body)
        res.send(user.toJSON())
    } catch (err) {
        console.log(err);
        res.status(400).send({
            error: 'Email already in Use'
        })
    }
}

我不知道代码有什么问题,我不知道为什么会收到 .create 的错误未定义

【问题讨论】:

  • 在 AuthController 类型 ``` const user = new User(req.body);等待用户保存(); ``` 而不是 const user = await User.create(req.body)
  • 我知道用户不是构造函数...任何想法

标签: node.js sequelize.js


【解决方案1】:

我认为你的问题出在最后一个文件中.. AuthController.js

const {User} = require ('../models/User')

你正在使用 Es6 新的销毁分配

更多信息在这里https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

通常你应该在没有括号的情况下定义你的变量

这意味着你得到了所有可用的变量。

但是加上括号意味着你要获取对象的子对象,这个子对象被命名为 user .. 然后将变量也命名为 user 并搜索这些信息 来自equal之后的require文件。

但是在您的用户文件中..您正在导出一个函数..没有任何名为 user 的子函数 因此未定义

更好的选择是使用类

更多信息在这里:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes

所以在用户模型中

// Inside your function you need to use sequalize module , iam not familar with it but you must require it to use it 

    const Sequelize = require('sequelize');
    
    // Define the Class
      class user {
    
    // add the name you want to use for the function - here I used create so the other code also work - also I inserted async because this is asynchronous  and also I removed the sequalize from parameters because you don't need it now after it is required above.
    
    async create (DataTypes) => {
        await Sequelize.define('User', {
            hmtec_email: {
                type: DataTypes.STRING,
                unique: true
            },
            hmtec_password: DataTypes.STRING
        })
    }
    
      module.exports = user;

现在,当您需要 Authcontroller 中的文件时,删除括号

const User = require ('../models/User')

现在你可以在你的 authController.js 中使用User.create(YOUR_DATA_VARIABLE);

如果这个类中还有其他函数,你也可以以同样的方式使用它们。

我希望这能解决您的问题。

【讨论】:

  • @HemmyhtecCreatives 欢迎您,如果它确实帮助您解决问题,请不要忘记投票并接受这个答案,祝您编码愉快。
  • 不工作...同样的错误....User.create 未定义
  • 好吧,我猜这不是您的完整代码,好吧,试试这个,使用您的旧代码,在 authController.js 中删除 const {User} = require ('../models/User') , 中的括号,将同一文件中的 const user = await User.create(req.body) 更改为 const user = await User(req.body , sequelize, DataTypes) - 在 User.js 的第一行 - 将 module.exports = (sequelize, DataTypes) => { 更改为 module.exports = (body, sequelize, DataTypes) => { 现在,当您想在 user.js 文件中使用 req.body 时,请改用 body
猜你喜欢
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 2020-11-25
  • 1970-01-01
  • 2020-10-15
  • 2020-05-28
  • 2021-09-13
  • 1970-01-01
相关资源
最近更新 更多