我正在使用 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 不为空,因此它不能采用空值,但我在 api 链接中传递了 todoId,并且我还编写了应该从 api 链接获取 todoId 并将该值分配给表中的 todoId 列的代码。
我无法理解为什么会收到此错误。还有一件事我无法理解,当我在 TodoItems 中也有 todoId 列时,但在错误中我能够看到 TodoItem 表的所有列,但看不到 TodoId,因为它是写的
“插入TodoItems
( id
, content
, complete
, createdAt
, updatedAt
)”。
为什么缺少 TodoId 列。我无法理解
请帮助提前谢谢!