从Azure表存储读取奇怪的JSON结构

时间:2017-11-22 15:16:01

标签: node.js azure-storage azure-functions azure-table-storage

我正在使用Azure功能中的azure-storage模块从Azure存储表中读取数据。

获取这样的行

var tableSvc = azure.createTableService();
var query = new azure.TableQuery().top(1000);
tableSvc.queryEntities('tablename', query, null, function(error, result, response) {
    // work with result.entries
}

生成的对象看起来很奇怪,因为每个列值都被放入其自己的对象中,并带有" _"键,所以JSON看起来像这样:

{
    "PartitionKey": {
        "$": "Edm.String",
        "_": "Keyname"
    },
    "RowKey": {
        "$": "Edm.String",
        "_": "Keyname"
    },
    "Title": {
        "_": "The Item Title"
    }
}

而不是我期望的:

{
    "PartitionKey": "Keyname",
    "RowKey": "Keyname",
    "Title": "The Item Title"
}

该表在Azure存储资源管理器中看起来很正常。这是正常的吗?或者我可以以某种方式影响查询的输出?

2 个答案:

答案 0 :(得分:3)

您可以将有效内容格式指定为application/json;odata=nometadata,然后通过response.body.value获取生成的对象。

var options = { payloadFormat: "application/json;odata=nometadata" };
tableSvc.queryEntities('tablename', query, null, options, function(error, result, response) {
    if(!error) {
        console.log(response.body.value);
    }
}

答案 1 :(得分:1)

这是设计的。请在他们的文档中查看此示例:https://docs.microsoft.com/en-us/azure/cosmos-db/table-storage-how-to-use-nodejs#add-an-entity-to-a-table

这可能是因为他们有一个他们试图维护的类型系统,即使在JS中也是如此。

也许写一个方法来为你抽象出来?

function getFromTable(cb) {
   var tableSvc = azure.createTableService();
   var query = new azure.TableQuery().top(1000);
   tableSvc.queryEntities('tablename', query, null, function(error, result, response) {
       var response = {};
       for(var item in result) {
           if(result.hasOwnProperty(item)) {
               response[item] = result[item]["_"];
           }
        }
        cb(response);
   }
}

我可能会转而使用Promise而不是回调,但这是个人选择。