无法使用节点js,mysql和sequelize库

时间:2018-02-08 14:51:00

标签: node.js express sequelize.js sequelize-cli

我使用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 idcontentcompletecreatedAtupdatedAt)”。

为什么缺少TodoId列。我无法理解

请提前帮助谢谢!!

1 个答案:

答案 0 :(得分:0)

我没有正确阅读文档,这就是为什么我没有宣布

todoId:{   type:DataTypes.BIGINT,   allowNull:false,   参考:{     型号:' todo',     关键:' id'   } },  在todoItems模型中