Отправка четкого сообщения об ошибке в ответ - PullRequest
0 голосов
/ 13 марта 2020

Это запрос 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');
}));

Другими словами, нужно ли мне проверять каждый тип ошибки?

...