开发者问题收集

SEQUELIZE:“无法读取未定义的属性‘长度’”

2020-05-27
9560

有人知道如何解决这个问题吗?有些东西我没看到。为了查看控制器是否正常工作,我以 json 格式返回了接收请求的响应,它工作正常,没有错误。

问题似乎出在控制器上,但是控制器……

编辑

控制器

import Post from '../models/Post';
import *  as Yup from 'yup';

class PostController {
    async store(req, res) {

        try {
            //Checks if the fields have been filled correctly
            const schema = Yup.object().shape({
                title: Yup.string()
                    .required(),
                content: Yup.string()
                    .required()
            });


            if(!(await schema.isValid(req.body))) {
                return res.status(400).json({ error: 'Error 1' });
            }

            //Abstraction of fields
            const { title, content } = req.body;
            const createPost = await Post.create(title, content);

            if(!createPost) {
                return res.json({error: 'Error 2'})
            }

            //If everything is correct, the information will be registered and returned.
            return res.json({
                title,
                content,
            });
        }
        catch (err) {
            console.log("Error: " + err);
            return res.status(400).json({error: 'Error 3'});
        }
    }
}

export default new PostController();

型号:

import Sequelize, { Model } from 'sequelize';

class Post extends Model {
    static init(sequelize) {
        //Fields registered by the user
        super.init({
            id: {
                type: Sequelize.INTEGER,
                primaryKey: true
            },
            title: Sequelize.STRING,
            content: Sequelize.TEXT,
            created_at: {
                type: Sequelize.DATE,
                defaultValue: Sequelize.NOW,
            },
            updated_at: {
                type: Sequelize.DATE,
                defaultValue: Sequelize.NOW,
            },
        },
        {
            sequelize,
            tableName: 'posts'
        });

        return this;
    }
}

export default Post;

迁移:

'use strict';

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('posts', {
        id: {
            type: Sequelize.INTEGER,
            allowNull: false,
            autoIncrement: true,
            primaryKey: true
        },
        title: {
            type: Sequelize.STRING,
            allowNull: false,
        },
        content: {
            type: Sequelize.TEXT,
            allowNull: false,
        },
        created_at: {
            type: Sequelize.DATE,
            allowNull: false,
        },
        updated_at: {
            type: Sequelize.DATE,
            allowNull: false,
        }
    });
  },

  down: (queryInterface) => {
    return queryInterface.dropTable('posts');
  }
};

终端错误:

TypeError: Cannot read property 'length' of undefined
3个回答

您需要在模型中定义迁移上的所有列。当您输入 allowNull: false 时,数据库需要列信息。

我相信您可以通过在 Model 中添加在 migration 上声明的列来解决,如果您不想在 Controller 上声明这些列,请在这些列上添加 defaultValue 属性。

这将允许 sequelize 在这些列上插入适当的数据。例如: defaultValue: Sequelize.NOWcreated_at 列上。

您需要输入的另一件事是表名,如下所示(这是我在其中一个项目中使用的模型:

static init(sequelize) {
        super.init(
            {
                categoryId: {
                    type: Sequelize.INTEGER,
                    primaryKey: true,
                    field: 'id',
                },
                dateUpdated: {
                    type: Sequelize.DATE,
                    field: 'updated_at',
                    defaultValue: Sequelize.NOW,
                },
                // ... other fields here,
            },
            {
                sequelize,
                tableName: 'categories',
            }
        );
    }
    // ... 
}

export default Category;

因此,请尝试将其作为实例导入,而不是作为类导入。

编辑 1: 其他事情。您答案中的错误位于文件 lib/model.js 的第 140 行( 请参阅 github 上的主存储库sequelize 的 )。

查看此内容,如果尚未声明主键,请尝试在模型上声明。

编辑 2: 在您的控制器中,尝试此操作( 根据文档 ):

await Post.create({ title, content });

尝试传递一个包含您要存储的信息的 json 对象,而不是作为参数。

编辑 3: 您需要在调用控制器之前导入 database.js ,我在这一点上遇到了问题(遵循 database.js 工作):

// Imports here
import Category from '../app/models/Category';
//...

const models = [
    // Models that I want to use
    Category,
    //...
];

class Database {
    constructor() {
        this.init();
    }
    // Load on database init
    init() {
        this.connection = new Sequelize(databaseConfig);
        models.forEach(model => model.init(this.connection));
    }
}

export default new Database();
William Prigol Lopes
2020-05-27

我遇到了与漩涡鸣人相同的问题。我忘记将与模型的连接放在初始化模型的文件中。

Leandro Lima
2022-10-18

我遇到了同样的问题

我的代码的问题在于我忘记将模块名称添加到我的 models 数组 中的 数据库的 index.js 文件中

例如: const **models** = [User,**Task**]

我在这篇文章中找到了答案: https://github.com/sequelize/sequelize/issues/11111#issuecomment-697078832

Naruto Uzumaki
2021-06-25