node.js - 无法使用 Node js、mysql 和 sequelize 库执行发布请求

标签 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 发出请求。

这是我的 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/

相关文章:

node.js graphql/sequelize 服务器为链接属性返回 null

node.js - Socket.IO - 如何获取不同端点/房间的不同事件用户列表?

node.js - Firebase云功能部署错误

javascript - 如何使用 Hapi.js 提供静态 HTML 索引

node.js - Mongoose 保存后返回值

node.js - 如何使用nodejs在sequelize中使用事务

node.js - 为什么sequelize返回500 [object SequelizeInstance :Users] when connecting to express session?

javascript - 如何将参数属性分配给 self?

node.js - 在reactjs中convert-csv-to-json返回错误

html - 如何在 express 元素中将 css 链接到 html?