NodeJS SEQUELIZE:“无法读取未定义的属性'length'”

lx0bsm1f  于 12个月前  发布在  Node.js
关注(0)|答案(4)|浏览(137)

有人知道如何解决这个问题吗?有一些我没有看到的东西。为了看看控制器是否工作,我返回了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

disbfnqx

disbfnqx1#

你需要定义你在模型中迁移的所有列。当你放置allowNull: false时,数据库需要列信息。
我相信你可以解决将你在migration上声明的列添加到Model中的问题,如果你不想在Controller上声明这些列,可以在这些列上添加defaultValue属性。
这将允许sequelize在这些列上插入适当的数据。例如:created_at列上的defaultValue: Sequelize.NOW
另一件需要输入的事情是表名,像这样(这是我在一个项目中使用的一个模型:

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();

pxq42qpu

pxq42qpu2#

我有同样的问题,鸣人涡卷。我忘了把连接的模型上的文件,初始化模型。

6tr1vspr

6tr1vspr3#

我也有同样的问题
我的代码的问题是,我忘记将模块名添加到models数组中的数据库的index.js文件中
例如:const **models** = [User,**Task**]
我在这篇文章中找到了答案:https://github.com/sequelize/sequelize/issues/11111#issuecomment-697078832

n8ghc7c1

n8ghc7c14#

在我的情况下,我在我的架构中的ENUM语法错误。当我纠正语法时,问题解决了。

相关问题