无法读取 expressjs 中未定义的属性“创建”

时间:2021-05-16 21:30:19

标签: node.js sequelize.js

请是 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 的错误未定义

1 个答案:

答案 0 :(得分:0)

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

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

您正在使用 Es6 新的销毁赋值

此处有更多信息https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

通常你应该定义没有括号的变量

这意味着您获得了所有可用的变量。

但是添加括号意味着您要获取对象的孩子,这个孩子被命名为 user .. 然后将变量也命名为 user 并搜索这些信息 来自相等之后的 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);

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

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