首页 > 解决方案 > 续集:TypeError:尝试在 DB 上创建数据时无法读取未定义的属性“长度”

问题描述

我正在做一个个人项目。基本上是一个基于节点的博客来学习语言......

我已经创建了类别和文章迁移和模型,现在我正在尝试开始创建用户。

这是我的用户迁移(20201124222940-create_users.js):

"use strict";

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable("users", {
      id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true,
        allowNull: false,
      },
      email: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      password: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      created_at: {
        type: Sequelize.DATE,
        allowNull: false,
      },
      updated_at: {
        type: Sequelize.DATE,
        allowNull: false,
      },
    });
  },

  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable("users");
  },
};

这是我的模型(User.js):

const { Model, DataTypes } = require('sequelize');

class User extends Model {
    static init(sequelize) {
        super.init({
            email: DataTypes.STRING,
            password: DataTypes.STRING,
        }, {
            sequelize,
            tableName: 'users'
        });
    }
}

module.exports = User;

//? Model de usuários

而且,这是我尝试创建用户的控制器(UsersController.js)。我正在使用 bcrypt 创建哈希并保护密码。

const express = require("express");
const router = express.Router();
const User = require('../models/User');
const bcrypt = require('bcryptjs');

router.get("/admin/users", (req, res) => {
    res.send("Listagem de usuários");
});

router.get("/admin/users/new", (req, res) => {
    res.render("admin/users/new");
});

router.post("/admin/users/create", (req, res) => {
    const email = req.body.email;
    const password = req.body.password;

    const salt = bcrypt.genSaltSync(10);
    const hash = bcrypt.hashSync(password, salt);

    User.create({
        email: email,
        password: hash,
    }).then(() => {
        res.redirect("/");
    }).catch((err) => {
        console.log(err);
        console.log(email, password, hash, salt)
    });

});

module.exports = router;

我得到的错误是:

TypeError: Cannot read property 'length' of undefined
    at User._initValues (D:\dev\blog_node\node_modules\sequelize\lib\model.js:140:49)
    at new Model (D:\dev\blog_node\node_modules\sequelize\lib\model.js:118:10)
    at new User (D:\dev\blog_node\models\User.js:3:1)
    at Function.build (D:\dev\blog_node\node_modules\sequelize\lib\model.js:2157:12)
    at Function.create (D:\dev\blog_node\node_modules\sequelize\lib\model.js:2207:23)
    at D:\dev\blog_node\controllers\UsersController.js:21:10
    at Layer.handle [as handle_request] (D:\dev\blog_node\node_modules\express\lib\router\layer.js:95:5)
    at next (D:\dev\blog_node\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (D:\dev\blog_node\node_modules\express\lib\router\route.js:112:3)       
    at Layer.handle [as handle_request] (D:\dev\blog_node\node_modules\express\lib\router\layer.js:95:5)

我已经测试了常量哈希、密码、盐、电子邮件.. 已经尝试创建一些手动数据,例如:密码:“123”,电子邮件:“asda@asda.com”。已经与其他两个模型和控制器相比,什么都没有出现。

那么,我在哪里失败了?

谢谢!

编辑 @Anatoly 注意到没有调用我的 User.init

所以......在评论之前:

const Sequelize = require("sequelize");
const dbConfig = require('./database');

const Category = require("../models/Category");
const Article = require("../models/Article");

const connection = new Sequelize(dbConfig);

Category.init(connection);
Article.init(connection);

Category.associate(connection.models);
Article.associate(connection.models);


module.exports = connection;

在他的评论之后:

const Sequelize = require("sequelize");
const dbConfig = require('./database');

const Category = require("../models/Category");
const Article = require("../models/Article");
const User = require("../models/User");

const connection = new Sequelize(dbConfig);

Category.init(connection);
Article.init(connection);
User.init(connection);

Category.associate(connection.models);
Article.associate(connection.models);


module.exports = connection;

太棒了!!!<3 解决了问题!

标签: javascriptnode.jsdatabasesequelize.js

解决方案


您应该在使用它之前初始化User模型,如下所示:

User.init(connection);

将此初始化与其他模型的初始化代码一起添加。


推荐阅读