当尝试执行POST方法时,我该如何修复此Sequelize数据库错误?

4
我正在使用Postman测试React应用程序中使用Sequelize、node和express的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。 我添加了我的代码图像。
React表单 React Form Trips控制器 Trips Controller Trips模型 Trips Model Trips路由器 Trips Router -Sam

我觉得这与错误信息“字段'title'没有默认值”有关 - 从你的插入语句中可以看出,你没有给title字段赋值,并且从模式中可以看出它没有默认值并且是NOT NULL。你需要给它一个默认值,使其可为空,或者提供一个值。如果你认为你已经为title列提供了一个值,那么你需要展示相关的代码。 - UncleDave
所以我尝试在Postman中提供一个值,链接是https://screencast.com/t/EVatPwcgEzV。所以我猜测我的代码设置有问题,无法从特定字段中获取值。 - SamuelP
我不知道express是否足够聪明来处理它,但是你那里的JSON格式是无效的。你必须使用双引号,而不是单引号。下拉菜单旁边写着“GraphQL”的地方可以改为“JSON (application/json)”,它会突出显示你的JSON中的任何问题。 - UncleDave
2个回答

2
你有两个问题:
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中未定义。

1

1. 默认情况下,它会在您的模型架构中查找createdAt和updatedAt字段。因此,如果您不想要这两个字段,则可以在模型架构中设置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});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接