【问题标题】:azure storage table retrieve rows with correct data types. All values are returned as string instead of their correct typeazure 存储表检索具有正确数据类型的行。所有值都作为字符串返回,而不是正确的类型
【发布时间】:2021-04-11 23:32:24
【问题描述】:

将 Node.js 与 Azure 存储表结合使用。

我创建了一个新表,其中包含两个字段/键(CreatedOn 和 NextRenewalDate)作为 Int64 值(自纪元以来的时间)。在将值保存到表之前,entgen 根据需要将值正确识别为 Int64。

我知道 Azure 文档说它将 int64 存储为字符串。这种情况已经很久了。

在获取之后和使用之前,我一直在解析我知道在我的应用代码中为 int64 的属性值。

我想知道情况是否仍然如此?当我从 Azure 存储表中读取值时,是否有任何内置方法可以获取正确的数据类型?

【问题讨论】:

    标签: node.js azure-storage


    【解决方案1】:

    表服务数据模型仅支持这 8 种类型。更多详情请参考here

    • Edm.Binary
    • Edm.Boolean
    • Edm.DateTime
    • Edm.Double
    • Edm.Guid
    • Edm.Int32
    • Edm.Int64
    • Edm.String

    此外,当我们从 Azure 表中检索实体时,实体将以 OData JSON 格式返回。根据 OData 协议 azure table 支持,Int64 将表示为string。更多详情请参考herehere

    【讨论】:

    • 谢谢吉姆。我看到了这个文档,我希望能提供一些天蓝色的东西来将实体转换回 json(就像他们允许使用实体生成器将 json 转换为实体一样),但我找不到类似的东西。我最终为我的需要编写了一个快速函数,只要我们在表读取期间获取元数据以及实体,它就可以工作。我会把它写成我自己问题的答案。
    【解决方案2】:

    我无法找到一种内置方法来读取/将 Azure 存储表实体转换回 json。

    所以我写了一个快速方法,只要您在有效负载中请求元数据,这将起作用。

    const options = {payloadFormat:"application/json;odata=fullmetadata"};

    这是可能对某人有所帮助的快速功能:

      function convertArrayOfEntitiesToJson(arrEntities){
    
         let arrRecords = [];
    
         for(let x=0; x < arrEntities.length; x++){
    
            const entity = arrEntities[x];
            let allKeys = Object.keys( entity )
            let record = {};
    
            allKeys.forEach(function(key){
    
               if(entity[key]['$'] === "Edm.Int64" )
                  record[key] = parseInt( entity[key]["_"] );
               else if(entity[key]['$'] === "Edm.DateTime" )
                  record[key] = new Date( entity[key]["_"] );
               else if(entity[key]['$'] === "Edm.Boolean" )
                  record[key] =  ( entity[key]["_"] == 'true' );
               else if(entity[key]['$'] === "Edm.Boolean" )
                  record[key] =  ( entity[key]["_"] == 'true' );
               else  // fall back to string
                  record[key] = entity[key]["_"];
            });
    
            arrRecords.push(record);
         }
    
         return arrRecords;
      }
    

    我故意遗漏了几种数据类型。我不需要其他类型。根据需要随意添加其他数据类型。

    【讨论】:

      猜你喜欢
      • 2014-12-12
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      • 2015-02-25
      • 2011-12-11
      • 1970-01-01
      • 2020-03-11
      • 2022-07-22
      相关资源
      最近更新 更多