SEQUELIZE: «Невозможно прочесть свойство 'length' из неопределенного» - PullRequest
0 голосов
/ 27 мая 2020

Кто-нибудь знает как это решить? Я чего-то не вижу. Чтобы проверить, работает ли контроллер, я вернул ответ, получая запрос в 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

1 Ответ

1 голос
/ 27 мая 2020

Вам необходимо определить все столбцы, которые вы переносите в свою модель. Когда вы вводите allowNull: false, базе данных нужна информация о столбце.

Я считаю, что вы можете решить добавление столбцов, которые вы объявили на своем migration, внутри своего Model, и, если вы не хотите объявлять эти столбцы на своем Controller, добавьте defaultValue свойство в этих столбцах.

Это позволит продолжить вставку соответствующих данных в эти столбцы. Например: defaultValue: Sequelize.NOW в столбце created_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;

И, следовательно, попробуйте импортировать как экземпляр, а не как класс.

EDIT 1: Другое. Ошибка в вашем ответ находится в строке 140 файла lib/model.js ( см. здесь, в github, о главном репозитории sequelize ).

Глядя на это, попробуйте объявить свой первичный ключ в модели, если вы еще не сделал.

РЕДАКТИРОВАТЬ 2: В вашем контроллере попробуйте это ( в соответствии с документами ):

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

Попробуйте передать объект json с информацией, которую вы хотите сохранить, а не в качестве параметров.

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