在Node.js中映射Azure表存储数据模型的最简单方法

4

当我想将我的JavaScript对象(或实体)添加到Azure表存储中时,我首先需要通过entityGenerator运行它们。

我的对象可能看起来像这样:

{
  id: 1,
  name: 'foo',
  timestamp: new Date()
}

我需要传递给TableService的实体将会长这样:
{
  id: { '_': 1, '$': 'Edm.Int32' },
  name: { '_': 'foo', '$': 'Edm.String' },
  timestamp:{ '_': new Date(), '$': 'Edm.DateTime' },
}

这也是从TableService返回实体的格式。
将我的对象映射到正确的格式以将它们发送到我的表格存储相当直观,但我还没有找到一种简单的方法来将服务返回的实体转换回常规的JavaScript对象,以便我可以轻松地处理。
我可以创建某种通用映射器函数来获取实体上的_属性中的值,但似乎有些元数据属性也被传递到实体本身中。 是否有人知道在JavaScript对象和Azure Table Storage实体之间进行映射的简便方法? 这个功能是否应该包含在azure-storage库中?
3个回答

0
如果有其他人遇到类似问题:你可以通过访问responsebody部分来获取值。结果包含实际表格实体。
因此,要访问示例中的名称部分,请使用response.body.name

0

我遇到了同样的问题,但决定在我的特定DAO和应用程序(nodejs)中根本不需要元数据。

最终使用map对result.entries进行操作,并返回一个清理过的对象。

  Object.keys(row).forEach((key) => {
     newRow[key] = row[key]['_']; 
  });

我认为Azure Storage应该提供更简单的方式来插入和删除数据。我需要构建一个类似于Map/Reduce的包装器,以便查询生成器不会向应用程序中添加额外的内容。换句话说,我想要一个简单的NodeJS DAO类。也许我们可以一起构建一个?


-1

由于 Azure Storage SDK for Node 是使用 Storage Rest API 实现的。要使用 Azure 存储资源,您可以利用 SDK 并自己实现 Rest API。

根据 API 参考文档,例如 插入实体,我们需要生成请求正文,如下:

{
   "Address":"Mountain View",
   "Age":23,
   "AmountDue":200.23,
   "CustomerCode@odata.type":"Edm.Guid",
   "CustomerCode":"c9da6455-213d-42c9-9a79-3e9149a57833",
   "CustomerSince@odata.type":"Edm.DateTime",
   "CustomerSince":"2008-07-10T00:00:00",
   "IsActive":true,
   "NumberOfOrders@odata.type":"Edm.Int64",
   "NumberOfOrders":"255",
   "PartitionKey":"mypartitionkey",
   "RowKey":"myrowkey"
}

这意味着我们需要在正文中定义属性的类型。

因此,在我看来,生成表实体最简单的方法是使用Azure Storage SDK通过entityGenerator函数。

如果还有任何疑问,请随时告诉我。


2
我理解entityGenerator的必要性,但我想知道是否有可能从TableService(https://github.com/Azure/azure-storage-node/blob/master/lib/services/table/internal/odatahandler.js#L155)返回原始值。一旦从表中获取了JavaScript对象,我就不需要所有这些OData类型和元数据。是否有任何方法可以从odatahandler返回此rawEntity? - Schaemelhout

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接