我在Sails.js中处理PostgreSQL BYTEA类型时遇到问题。
表定义(是的,创建二进制PK很奇怪,但some_data总是很小):
CREATE TABLE data_blobs (
some_data BYTEA PRIMARY KEY,
my_date_time TIMESTAMP WITH TIME ZONE NOT NULL);
模型配置如下所示:
module.exports = {
tableName: 'data_blobs',
autoCreatedAt: false,
autoUpdatedAt: false,
autoPK: false,
attributes: {
some_data: {
type: 'binary',
primaryKey: true
},
my_date_time: 'datetime',
};
当我使用node-postgres(pg)从node.js查询表时,结果包含带有some_data的节点缓冲区,这非常容易使用。
但是当我使用类似这样的代码从Sails.js查询表时:
DataBlobs.find().then(function(result){
console.log('Result: ');
console.log(result);
});
结果看起来像这样:
{
some_data:
{ '0': 1,
'1': 79,
'2': 95,
...
'19': 216,
length: 20,
parent:
{ '0': 47,
...
'8191': 0 }
},
my_date_time: '2015-08-24T10:43:11.959Z'
}
在我看来,Waterline将Node Buffer转换为奇怪且无用的东西(没有额外的转换)。我找不到任何关于数据转换的文档,不是在Waterline文档中,也不是在sails-postgresql文档中。
我认为有两种方法可以解决这种情况:
第二个选项似乎不太有效,因为原始数据附加了大的父母'并且将有两次转换Buffer-> Waterline-> MyFormat而不是简单的Buffer-> MyFormat。
答案 0 :(得分:0)
我找到的第一个解决方案是基于将水线模型函数覆盖为JSON(https://github.com/balderdashy/waterline#model)的想法。
我写了一个转换函数:
function internalWaterlineBinaryToBase64(waterlineBinaryRepresentation) {
var temporaryArray = [];
for(var i = 0, arrLength = waterlineBinaryRepresentation.length; i < arrLength; i++) {
temporaryArray.push(waterlineBinaryRepresentation[i.toString()]);
}
var temporaryBuffer = new Buffer(temporaryArray);
return temporaryBuffer.toString('base64');
}
并调整了我的模型:
module.exports = {
tableName: 'data_blobs',
autoCreatedAt: false,
autoUpdatedAt: false,
autoPK: false,
attributes: {
some_data: {
type: 'binary',
primaryKey: true
},
my_date_time: 'datetime',
toJSON: function() {
var obj = this.toObject();
if(obj.some_data) {
obj.some_data = internalWaterlineBinaryToBase64(obj.some_data);
}
return obj;
}
};
它工作正常,但在我看来应该有一个更便宜的方法(水线将原始缓冲区转换为对象,然后我将其转换为数组,然后转换为缓冲区,然后转换为字符串)。