SEQUELIZE:“无法读取未定义的属性‘长度’”
有人知道如何解决这个问题吗?有些东西我没看到。为了查看控制器是否正常工作,我以 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
您需要在模型中定义迁移上的所有列。当您输入
allowNull: false
时,数据库需要列信息。
我相信您可以通过在
Model
中添加在
migration
上声明的列来解决,如果您不想在
Controller
上声明这些列,请在这些列上添加
defaultValue
属性。
这将允许 sequelize 在这些列上插入适当的数据。例如:
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;
因此,请尝试将其作为实例导入,而不是作为类导入。
编辑 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();
我遇到了与漩涡鸣人相同的问题。我忘记将与模型的连接放在初始化模型的文件中。
我遇到了同样的问题
我的代码的问题在于我忘记将模块名称添加到我的 models 数组 中的 数据库的 index.js 文件中
例如:
const **models** = [User,**Task**]
我在这篇文章中找到了答案: https://github.com/sequelize/sequelize/issues/11111#issuecomment-697078832