使用节点转换Azure表存储的响应

时间:2015-12-17 12:18:47

标签: node.js azure-storage lodash hapijs

我正在创建一个带有Node的REST API,它从Azure表存储中读取。

输出类似于以下内容:

[  
   {  
      "PartitionKey":{  
         "$":"Edm.String",
         "_":"sdsdsdsd"
      },
      "RowKey":{  
         "$":"Edm.String",
         "_":"sdsdsdsdsd"
      },
      "Timestamp":{  
         "$":"Edm.DateTime",
         "_":"2015-08-20T01:56:37.499Z"
      },
      "Destination":{  
         "_":"sdsdsdsdsd"
      },
      "QueryParameters":{  
         "_":"sdsddsadsadsd"
      },
      "Referrer":{  
         "_":"sddsadsadss"
      },
      "RequestTime":{  
         "$":"Edm.DateTime",
         "_":"sdsddsdsd"
      },
      "SiteUrl":{  
         "_":"sdsdsdsdd"
      },
      ".metadata":{  
         "etag":"W/"datetime'2015-08-20T01:56:37.4999599Z'""
      }
   }
]

我正在使用lodash,因为我想要转换响应,因此它具有以下内容:

  • 所有属性均为小写。例如。 PartitionKey成为partitionkey
  • 删除所有包含密钥'$'
  • 的属性
  • 如果它们只是对象中的单个属性且其键为“_”,则将该值赋给父级并删除对象的需要。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

考虑到您已将json对象分配给raw对象, 这是在lodash上做到这一点的一种方法。

在处理值之前首先规范化键:

const _ = require('lodash')

const lowKey = _.mapKeys(raw, (v,k) => k.toLowerCase())[0]
const norm = _.mapValues(lowKey, (v)=> {
    delete v.$
    if(Object.keys(v).length ===1 && v._) return v._;
    else return v;
});
console.log(norm)