sails.js -postgresql, возвращающий строковое значение вместо целого числа для полей bigint

Мы переносим проект из PHP в Node.js, используя Sails.js в качестве базового фреймворка. Мы не можем изменить нашу базу данных и должны использовать существующую базу данных для этого проекта.

Если я сохраню migrate: "alter" для вновь созданной модели Sails по умолчанию сохранит id поле как целое число.

Тем не менее, для нашей существующей базы данных, id поля в основном bigint, Итак, я определил migrate: "safe" и приступил к созданию модели.

Теперь проблема, с которой я сталкиваюсь, заключается в том, что, когда маршрутные маршруты возвращают результат, значение столбца id, которое должно быть возвращено как число, вместо этого возвращается в виде строки. Вот пример:

[
  {
    "starttime": "07:00:00",
    "endtime": "14:00:00",
    "id": "1"
  },
  {
    "starttime": "14:00:00",
    "endtime": "22:00:00",
    "id": "2"
  },
  {
    "starttime": "22:00:00",
    "endtime": "07:00:00",
    "id": "3"
  }
]

Как я могу исправить эту проблему?

Вот моя модель:

module.exports = {
  tableName: "timeslots",
  autoCreatedAt: false,
  autoUpdatedAt: false,
  attributes: {
    starttime: { type: "string", required: true },
    endtime: { type: "string", required: true }
  }
};

А вот определение таблицы postgresql

                                              Table "public.timeslots"
  Column   |  Type  |                       Modifiers                        | Storage  | Stats target | Description 
-----------+--------+--------------------------------------------------------+----------+--------------+-------------
 id        | bigint | not null default nextval('timeslots_id_seq'::regclass) | plain    |              | 
 starttime | text   | not null                                               | extended |              | 
 endtime   | text   | not null                                               | extended |              | 
Indexes:
    "idx_43504_primary" PRIMARY KEY, btree (id)
Referenced by:
    TABLE "doctortimeslot" CONSTRAINT "doctortimeslot_ibfk_2" FOREIGN KEY (timeslot_id) REFERENCES timeslots(id) ON UPDATE CASCADE ON DELETE CASCADE

2 ответа

Решение

Waterline становится странным с типами данных, в которые он не встроен. Я думаю, что по умолчанию используются строки, когда он не уверен, что делать. Это не должно иметь большого значения, так как JS автоматически преобразует эти значения в числа на вашем веб-интерфейсе.

Однако, если вам нужно, чтобы это было число, простейшим решением, вероятно, было бы переопределение метода toJSON в модели и присвоение этому значению целого числа.

module.exports = {
  tableName: "timeslots",
  autoCreatedAt: false,
  autoUpdatedAt: false,
  attributes: {
    starttime: { type: "string", required: true },
    endtime: { type: "string", required: true },

    toJSON: function(){
      var obj = this.toObject();
      obj.id = parseInt(obj.id);
      return obj;
    }

  }
};

В качестве альтернативы вы можете использовать https://github.com/mirek/node-pg-safe-numbers который решает именно эту проблему, делегируя небезопасную обработку вам (когда число не соответствует пределу 2^53 javascript) - где Вы можете вернуть проанализированное значение, строку, ноль, выдать ошибку или сделать что-то еще.

Во многих случаях вы можете использовать автоматический разбор, предоставляемый библиотекой, а в небезопасном обработчике просто вернуть исходное строковое значение. Тогда в коде, который использует числа выше 2^53 (т.е. случайные большие числа), всегда приводите к строке, и все будет в порядке.

Другие вопросы по тегам