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 (т.е. случайные большие числа), всегда приводите к строке, и все будет в порядке.