0

我正在使用 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 列。我无法理解

请帮助提前谢谢!

4

1 回答 1

0

我没有正确阅读文档,这就是我没有声明的原因

todoId: { type: DataTypes.BIGINT, allowNull: false, references: { model: 'todo', key: 'id' } },在 todoItems 模型中

于 2018-02-08T17:16:43.560 回答