Это запрос 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));
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" выходит за пределы диапазона для целочисленного типа
в теле ответа нигде нет 1028 *!
Итак, вот мои вопросы:
ВОПРОС 1: Почему зарегистрированная ошибка отличается от ошибки в ответе, несмотря на тот факт, что это один и тот же объект?
ВОПРОС 2: Как мне получить доступ только к сообщению об ошибке и отправить его в ответе?
ПРИМЕЧАНИЕ: Ответы, доступные в SO относительно обработки ошибок секвелизации, не дают ответа на это. Например, большинство ответов таковы:
sequelize.create({
name: req.body.name,
email: req.body.email })
.then((data)=> { res.send('mysuccess message'); })
.catch(Sequelize.UniqueConstraintError => {
res.send('myerrormessage');
}));
Другими словами, нужно ли мне проверять каждый тип ошибки?