javascript - 发送明确的错误消息作为响应
问题描述
这是续集请求:
models.client
.create(clientInformation)
.then(clientCreated => {
logger.info("clientCreated", JSON.stringify(clientCreated));
res.status(200).json(clientCreated);
})
.catch(error => {
logger.error("error", JSON.stringify(error));
res.status(400).json(error);
});
这是客户端模型,
module.exports = function(sequelize, DataTypes) {
var client = sequelize.define(
"client",
{
id: {
type: DataTypes.INTEGER,
primaryKey: true,
allowNull: false,
autoIncrement: true,
unique: true
},
nomClient: DataTypes.STRING,
numTel: {
type: DataTypes.INTEGER,
unique: true
},
email: {
type: DataTypes.STRING,
unique: true
},
addresse: {
type: DataTypes.STRING,
unique: true
},
ville: DataTypes.STRING
},
{ timestamps: true }
);
return client;
};
我故意在 req.body 中发送无效数据,以实现清晰的错误处理。所以在回复中,我得到了这个:
{
"name": "SequelizeDatabaseError",
"parent": {
"name": "error",
"length": 177,
"severity": "ERROR",
"code": "22003",
"file": "d:\\pginstaller_12.auto\\postgres.windows-x64\\src\\backend\\utils\\adt\\numutils.c",
"line": "253",
"routine": "pg_strtoint32",
"sql": "INSERT INTO \"clients\" (\"id\",\"nomClient\",\"numTel\",\"email\",\"addresse\",\"ville\",\"createdAt\",\"updatedAt\") VALUES (DEFAULT,$1,$2,$3,$4,$5,$6,$7) RETURNING *;",
"parameters": [
"Sam",
"5578757867",
"eazfafe@gmail.com",
"Nabeul",
"RueDuMerle",
"2020-03-13 08:53:41.214 +00:00",
"2020-03-13 08:53:41.214 +00:00"
]
},
"original": {
"name": "error",
"length": 177,
"severity": "ERROR",
"code": "22003",
"file": "d:\\pginstaller_12.auto\\postgres.windows-x64\\src\\backend\\utils\\adt\\numutils.c",
"line": "253",
"routine": "pg_strtoint32",
"sql": "INSERT INTO \"clients\" (\"id\",\"nomClient\",\"numTel\",\"email\",\"addresse\",\"ville\",\"createdAt\",\"updatedAt\") VALUES (DEFAULT,$1,$2,$3,$4,$5,$6,$7) RETURNING *;",
"parameters": [
"Sam",
"5578757867",
"eazfafe@gmail.com",
"Nabeul",
"RueDuMerle",
"2020-03-13 08:53:41.214 +00:00",
"2020-03-13 08:53:41.214 +00:00"
]
},
"sql": "INSERT INTO \"clients\" (\"id\",\"nomClient\",\"numTel\",\"email\",\"addresse\",\"ville\",\"createdAt\",\"updatedAt\") VALUES (DEFAULT,$1,$2,$3,$4,$5,$6,$7) RETURNING *;",
"parameters": [
"Sam",
"5578757867",
"eazfafe@gmail.com",
"Nabeul",
"RueDuMerle",
"2020-03-13 08:53:41.214 +00:00",
"2020-03-13 08:53:41.214 +00:00"
]
}
在记录的错误是这样的:
DatabaseError [SequelizeDatabaseError]: value "5578757867" is out of range for type integer
at Query.formatError (C:\work\ViwoneSavServer\Backend\node_modules\sequelize\lib\dialects\postgres\query.js:366:16)
at C:\work\ViwoneSavServer\Backend\node_modules\sequelize\lib\dialects\postgres\query.js:72:18
at tryCatcher (C:\work\ViwoneSavServer\Backend\node_modules\bluebird\js\release\util.js:16:23)
at Promise._settlePromiseFromHandler (C:\work\ViwoneSavServer\Backend\node_modules\bluebird\js\release\promise.js:547:31)
at Promise._settlePromise (C:\work\ViwoneSavServer\Backend\node_modules\bluebird\js\release\promise.js:604:18)
at Promise._settlePromise0 (C:\work\ViwoneSavServer\Backend\node_modules\bluebird\js\release\promise.js:649:10)
at Promise._settlePromises (C:\work\ViwoneSavServer\Backend\node_modules\bluebird\js\release\promise.js:725:18)
at _drainQueueStep (C:\work\ViwoneSavServer\Backend\node_modules\bluebird\js\release\async.js:93:12)
at _drainQueue (C:\work\ViwoneSavServer\Backend\node_modules\bluebird\js\release\async.js:86:9)
at Async._drainQueues (C:\work\ViwoneSavServer\Backend\node_modules\bluebird\js\release\async.js:102:5)
at Immediate.Async.drainQueues [as _onImmediate] (C:\work\ViwoneSavServer\Backend\node_modules\bluebird\js\release\async.js:15:14)
我的问题是记录的消息中存在的信息:
值“5578757867”超出整数类型的范围
在响应正文中无处可寻!
所以这是我的问题:
问题 1:为什么记录的错误与响应中的错误不同,尽管它是同一个对象?
问题 2:我如何只访问错误消息并在响应中发送它?
注意: SO 中关于 sequelize 错误处理的答案不提供对此的回应。例如,大多数答案是这样的:
sequelize.create({
name: req.body.name,
email: req.body.email })
.then((data)=> { res.send('mysuccess message'); })
.catch(Sequelize.UniqueConstraintError => {
res.send('myerrormessage');
}));
换句话说,我需要检查每种错误类型吗?
解决方案
我知道这个问题被问到已经有一段时间了,但我偶然发现了同样的问题,并通过使用error.message
而不是error
从 Sequelize 获取确切的错误消息来解决它。所以你的代码会变成
models.client
.create(clientInformation)
.then(clientCreated => {
logger.info("clientCreated", JSON.stringify(clientCreated));
res.status(200).json(clientCreated);
})
.catch(error => {
logger.error("error", JSON.stringify(error.message));
res.status(400).json(error.message);
});
推荐阅读
- android - 删除旧地图标记并在集群管理器中加载新标记
- acumatica - 在 Acumatica 中为通用查询添加可点击链接
- php - 当值作为字符串返回时,在 PHP 中格式化日期
- reactjs - redux saga 如何在函数中触发 next
- html - go/golang 服务器中的静态 css 文件
- swift - 基于 3 个值的简单验证条件
- c# - 使用 SSL/TLS HTTPS 从 C# 启动轻量级 Web 服务器 - 无需安装证书/使用 netsh?
- php - codeigniter 3 php 7.2 count() 函数不起作用
- sql - Hive SQL 删除数组中的空元素
- python - 从 2d numpy 数组中提取旋转的 1d 轮廓的结果不一致