2015-10-03 39 views
2

我們正在使用Sails.js作爲後端框架將項目從PHP遷移到Node.js。我們不能修改我們的數據庫,並且不得不爲現有的數據庫使用這個項目。sails.js -postgresql爲bigint字段返回字符串值而不是整數

如果我爲新創建的模型保留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

水線會很奇怪與數據類型不具有內置的,我認爲它默認爲字符串時,不知道該怎麼做。這實際上並不重要,因爲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; 
    } 

    } 
}; 
+0

完美!重寫toJSON方法對我來說是一個理想的解決方案,因爲API將被本機android和iOS應用程序使用。謝謝! –

+0

無論如何,是否有可能爲所有模型重寫此方法,而無需在每個模型中明確指定? –

+0

找到它了。在model.js文件中指定'attributes:{ toJSON:function(){var _j = this.toObject(); obj.id = parseInt(obj.id); return obj; } }' –

1

作爲替代,您可以使用https://github.com/mirek/node-pg-safe-numbers其通過委託不安全的處理,以你到底這個問題涉及(當數不適合2^53 JavaScript的限制) - 在這裏你可以返回解析值,字符串,空,拋出錯誤或做其他事情。

在很多情況下,您可以使用庫提供的自動解析,並在不安全的處理程序中返回原始字符串值。然後在使用2^53以上的數字的代碼(即隨機大數字)總是投射到字符串,你會沒事的。

相關問題