尝试执行 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编码错误