我使用node.js,Mysql和Sequelize ORM Library为简单的Todo App制作api。基本上有2个表Todos和TodoItems。这两个表之间的关系是
1)Todo可以拥有许多TodoItems。 2)TodoItem只能有一个TodoId。
所以根据第二种关系,我在TodoItems表中创建一个外键,并在TodoItems表中发出输入TodoItem的帖子请求。
这是我在表格中创建和输入todoitem的控制器功能
const TodoItem = require('../models').TodoItem;
module.exports = {
create(req, res) {
console.log(req.params.todo_id)
return TodoItem
.create({
content: req.body.content,
todoId: req.params.todo_id,
})
.then(todoItem => res.status(201).send(todoItem))
.catch(error => res.status(400).send(error));
},
};
这是我用于创建TodoItems表的迁移文件
'use strict';
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('TodoItems', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
content: {
type: Sequelize.STRING
},
complete: {
type: Sequelize.BOOLEAN
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
},
todoId:{
type:Sequelize.INTEGER,
onDelete: 'CASCADE',
allowNull:false,
references:{
model:'Todos',
key: 'id',
as: 'todoId',
}
},
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('TodoItems');
}
};
和路由器的功能是
var express = require ('express');
var router = express.Router();
var model = require('../models/index');
var db = require('../models');
const todosItemsController = require('../controllers').todoItems;
router.post('/:todo_id', todosItemsController.create);
module.exports = router;
所以api链接有点像这样
本地主机:4006 / todoitems / 1
但是当我在邮递员中运行这个api进行测试时,它会给出这个错误
{
"name": "SequelizeDatabaseError",
"parent": {
"code": "ER_NO_DEFAULT_FOR_FIELD",
"errno": 1364,
"sqlState": "HY000",
"sqlMessage": "Field 'todoId' doesn't have a default value",
"sql": "INSERT INTO `TodoItems` (`id`,`content`,`complete`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'first todo item inside first todo',false,'2018-02-08 14:38:10','2018-02-08 14:38:10');"
},
"original": {
"code": "ER_NO_DEFAULT_FOR_FIELD",
"errno": 1364,
"sqlState": "HY000",
"sqlMessage": "Field 'todoId' doesn't have a default value",
"sql": "INSERT INTO `TodoItems` (`id`,`content`,`complete`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'first todo item inside first todo',false,'2018-02-08 14:38:10','2018-02-08 14:38:10');"
},
"sql": "INSERT INTO `TodoItems` (`id`,`content`,`complete`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'first todo item inside first todo',false,'2018-02-08 14:38:10','2018-02-08 14:38:10');"
}
因为我已经验证了todoId不为null所以它不能取空值但是我在api链接中传递todoId并且我还编写了应该从api链接获取todoId并将该值分配给todoId列的代码桌子。
我无法理解为什么会收到此错误。 还有一件事,当我在TodoItems中也有todoId列时我无法理解但是在错误中我能够看到TodoItem表的所有列而不是TodoId,因为它是写的
“插入TodoItems
id
,content
,complete
,createdAt
,updatedAt
)”。
为什么缺少TodoId列。我无法理解
请提前帮助谢谢!!
答案 0 :(得分:0)
我没有正确阅读文档,这就是为什么我没有宣布
todoId:{ type:DataTypes.BIGINT, allowNull:false, 参考:{ 型号:' todo', 关键:' id' } }, 在todoItems模型中