【问题标题】:Getting BYTEA from PostgreSQL in Sails.js在 Sails.js 中从 PostgreSQL 获取 BYTEA
【发布时间】:2015-08-25 12:24:23
【问题描述】:

我在处理 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 文档中找不到任何关于数据转换的文档。

我看到了两种处理这种情况的选择:

  1. 以某种方式阻止 Waterline 转换 Buffer 并执行 自行转换。
  2. 获取 Waterline 输出并将其转换为 控制器。

第二个选项似乎不太有效,因为原始数据附加了大的“父”,并且会有两个转换 Buffer->Waterline->MyFormat 而不是简单的 Buffer->MyFormat。

【问题讨论】:

    标签: javascript node.js sails.js waterline sails-postgresql


    【解决方案1】:

    我找到的第一个解决方案是基于将 Waterline Model 函数重写为 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;
        }
    };
    

    它工作正常,但在我看来应该有一个更便宜的方法(水线将原始 Buffer 转换为对象,然后我将其转换为 Array,然后转换为 Buffer,然后转换为 String)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多