我正在使用 node.js、Mysql 和 Sequelize ORM Library 为简单的 Todo App 制作 api。基本上有 2 个表 Todos 和 TodoItems。这两个表的关系是
1) 一个 Todo 可以有很多 TodoItems 。
2) 一个 TodoItem 只能有一个 TodoId。
所以根据第二个关系,我在 TodoItems 表中创建一个外键,并为在 TodoItems 表中输入一个 TodoItem 发出请求。
这是我的 Controller 功能,用于在表中创建和输入 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
但是当我在 postman 中运行这个 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 列。我无法理解
请帮助提前致谢!!
最佳答案
我没有正确阅读文档,这就是为什么我没有声明
待办事项:{
类型:DataTypes.BIGINT,
allowNull: 假,
引用: {
模型:'待办事项',
键:'身份证'
}
},
在 todoItems 模型中
关于node.js - 无法使用 Node js、mysql 和 sequelize 库执行发布请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48688264/