我在处理 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 文档中找不到任何关于数据转换的文档。
我看到了两种处理这种情况的选择:
- 以某种方式阻止 Waterline 转换 Buffer 并自己进行转换。
- 获取 Waterline 输出并将其转换为控制器。
第二个选项似乎不太有效,因为原始数据附加了大的“父级”,并且会有两次转换 Buffer->Waterline->MyFormat 而不是简单的 Buffer->MyFormat。