尝试执行 POST 方法时如何修复此 Sequelize Database 错误?

Posted

技术标签:

【中文标题】尝试执行 POST 方法时如何修复此 Sequelize Database 错误?【英文标题】:How Do I Fix this Sequelize Database Error when trying to do a POST method? 【发布时间】:2020-03-26 01:11:38 【问题描述】:

我正在使用 Postman 使用 Sequelize、node 和 express 测试我的 React 应用程序的 POST 路由。我在下面收到此错误


    "name": "SequelizeDatabaseError",
    "parent": 
        "code": "ER_NO_DEFAULT_FOR_FIELD",
        "errno": 1364,
        "sqlState": "HY000",
        "sqlMessage": "Field 'title' doesn't have a default value",
        "sql": "INSERT INTO `Trips` (`id`,`createdAt`,`updatedAt`) VALUES (DEFAULT,?,?);",
        "parameters": [
            "2019-12-01 00:50:42",
            "2019-12-01 00:50:42"
        ]
    ,
    "original": 
        "code": "ER_NO_DEFAULT_FOR_FIELD",
        "errno": 1364,
        "sqlState": "HY000",
        "sqlMessage": "Field 'title' doesn't have a default value",
        "sql": "INSERT INTO `Trips` (`id`,`createdAt`,`updatedAt`) VALUES (DEFAULT,?,?);",
        "parameters": [
            "2019-12-01 00:50:42",
            "2019-12-01 00:50:42"
        ]
    ,
    "sql": "INSERT INTO `Trips` (`id`,`createdAt`,`updatedAt`) VALUES (DEFAULT,?,?);",
    "parameters": [
        "2019-12-01 00:50:42",
        "2019-12-01 00:50:42"
    ]

我的表的架构如下

CREATE TABLE Trips (
  id INT NOT NULL AUTO_INCREMENT,
  title varchar(255) NOT NULL,
  location varchar(255) DEFAULT NULL,
  Description varchar(255) DEFAULT NULL,
  tripDate datetime DEFAULT NULL,
  image varchar(255) DEFAULT NULL,
  createdAt timestamp default current_timestamp,
  updatedAt timestamp,
  PRIMARY KEY (id)
);

我尝试将各个列更改为 DEFAULT NULL,但即使我在这些字段中输入数据,我在数据库中也返回 null。我添加了我的代码的图像。

反应形式

行程控制器

旅行模型

旅行路由器

-山姆

【问题讨论】:

我会说这与错误消息“字段'标题'没有默认值”有关-我可以从您的插入语句中看到您没有为title 字段,我可以从架构中看到它没有默认值并且是 NOT NULL。您需要给它一个默认值,使其可以为空,或者提供它。如果您认为自己正在title 列提供值,那么您需要显示相关代码。 所以我确实尝试在 Postman screencast.com/t/EVatPwcgEzV 中以某个值提供它。所以我猜我的代码设置错误,无法从特定字段中获取值? 我不知道 express 是否足够聪明来处理它,但你所拥有的不是有效的 JSON。您必须使用双引号,而不是单引号。 “GraphQL”旁边的“文本”下拉菜单可以更改为“JSON(应用程序/json)”,它应该突出显示您的 JSON 的任何问题。 【参考方案1】:

你有两个问题:

1) 在您的 SQL 声明和模型声明中,您缺少 title 列的默认值。

您的 SQL 表声明应如下所示:

CREATE TABLE Trips (
  id INT NOT NULL AUTO_INCREMENT,
  title varchar(255) DEFAULT NULL, -- Or any other default value
  location varchar(255) DEFAULT NULL,
  Description varchar(255) DEFAULT NULL,
  tripDate datetime DEFAULT NULL,
  image varchar(255) DEFAULT NULL,
  createdAt timestamp default current_timestamp,
  updatedAt timestamp,
  PRIMARY KEY (id)
);

根据此声明,您的模型声明应为:

const Trips = sequelize.define('Trips', 
    title:  
             type: DataTypes.STRING,
             defaultValue: null // or whatever you would like
    ,
    location:DataTypes.STRING,
    Description:DataTypes.STRING,
    tripDate:DataTypes.DATEONLY,
    image:DataTypes.STRING
  ,

如果修改这两个后仍然出现此错误,则说明问题出在客户端 一方面,由于某种原因,标题数据没有传递到服务器,因此是 在 req.body 中未定义

【讨论】:

【参考方案2】:

1.默认情况下,它会在您的模型架构中查找 createdAt,updatedAt。 因此,要么添加 createdAt,updatedAt,否则如果您不想要这 2 个字段,则在模型架构中设置 timestamps:false。

2.您应该在模型架构中添加 id 字段,因为 sequelize 始终需要在模型架构中具有主键的 id 字段。它在每个模型中都是必需的。

 const Trips = sequelize.define('Trips',
id: 
    allowNull: false,
    autoIncrement: true,
    primaryKey: true,
    type: Sequelize.INTEGER
  ,
  title:DataTypes.STRING,
  location:DataTypes.STRING,
  Description:DataTypes.STRING,
  tripDate:DataTypes.DATEONLY,
  image:DataTypes.STRING
  ,
 timestamps:false);

【讨论】:

以上是关于尝试执行 POST 方法时如何修复此 Sequelize Database 错误?的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试在 sequel pro 中运行此查询时出现错误 [重复]

markdown 修复导入的SQL文件的Sequel Pro SQL编码错误

如何修复此路由不支持 GET 方法

如何修复此类型错误?

`except': EXCEPT 不支持 (Sequel::InvalidOperation)

如何修复此 MYSQL//Phpmyadmin 错误? [复制]