Хранение свойства даты для объекта хранилища таблиц Azure с мобильными службами и Node.js

Я работаю с пользовательскими API-интерфейсами Windows Azure Mobile Services и Windows Azure SDK для Node.js.

У меня есть простой скрипт, который начинается с импорта модуля azure.

var azure = require('azure');
var tableService = azure.createTableService();

В ответ на сообщение о моем пользовательском API я хотел бы вставить объект в хранилище таблиц Azure (не базу данных Azure Sql) с несколькими свойствами, одним из которых является отметка времени (экземпляр из Date).

    var entity = {
      PartitionKey: partitionKey
      RowKey: rowKey,
      Time: new Date()
    };

    tableService.insertOrReplaceEntity(tableName, entity, callback);

В результате свойство Time сохраняется вместе с сущностью в виде строки, а не даты. Например, свойство Time будет храниться как строка Mon Aug 12 2013 20:32:51 GMT+0000 (Coordinated Universal Time). Я убедился в этом, загрузив таблицу из обозревателя серверов в Visual Studio и изучив сведения о вставленном объекте.

Я знаю, что вы можете хранить даты в хранилище таблиц Azure, и я сделал это на C#. Однако приведенное выше не работает, и я не могу придумать более канонический пример для тестирования с моим собственным API, написанным на Javascript.

См. также Как использовать Table Service из Node.js, который показывает аналогичный пример.

Так как же сохранить свойство даты с ожидаемым типом данных с помощью пакета SDK для Azure Node.js?


person Michael Petito    schedule 12.08.2013    source источник


Ответы (1)


В этом примере свойство Time сохраняется с использованием типа данных WCF DateTime. Используя этот код:

var azure = require('azure');
var tableService = azure.createTableService(accountName, accountKey, host);

tableService.createTableIfNotExists('testtable', function(error){
  if(!error){
    var item = {PartitionKey: "Things"
                , RowKey: "123"
                , name: "Thing to add"
                , category: "Test"
                , time: new Date()};
    tableService.insertOrReplaceEntity('testtable', item, function(error){
      if(!error){
        console.log('Item inserted');
        tableService.queryEntity('testtable'
          , 'Things'
          , '123'
          , function(error, entity){
              if(!error){
                  console.log(entity);
              }
          });
      }
    });
  }
});

Если я запускаю этот код, я получаю:

Done
Item inserted
{ _:
   { 'xml:base': 'https://XXXXXX.table.core.windows.net/',
     xmlns: 'http://www.w3.org/2005/Atom',
     'xmlns:d': 'http://schemas.microsoft.com/ado/2007/08/dataservices',
     'xmlns:m': 'http://schemas.microsoft.com/ado/2007/08/dataservices/metadata',
     etag: 'W/"datetime\'2013-12-12T16%3A11%3A38.118877Z\'"',
     ContentRootElement: 'm:properties',
     id: 'https://XXXXXX.table.core.windows.net/testtable(PartitionKey=\'Things\',RowKey=\'123\')',
     category: { '$': [Object] },
     link: 'testtable(PartitionKey=\'Things\',RowKey=\'123\')',
     title: '',
     updated: '2013-12-12T16:11:38Z',
     author: { name: '' } },
  PartitionKey: 'Things',
  RowKey: '123',
  Timestamp: Thu Dec 12 2013 16:11:38 GMT+0000 (GMT Standard Time),
  category: 'Test',
  name: 'Thing to add',
  time: Thu Dec 12 2013 16:11:38 GMT+0000 (GMT Standard Time) }

Это показывает значение DateTime, а не строку для поля time. Он также отображается как поле DateTime в средстве просмотра/редакторе хранилища таблиц Visual Studio.

Если я запрошу эту же таблицу с помощью кода C#, я также верну значение C# DateTime для поля time.

person Dominic Betts    schedule 03.09.2013
comment
ваш код не включает фактический метод сохраняемости, который скрыт в Task.addTask. - person oligofren; 06.12.2013
comment
Я обновил пример, чтобы сделать его немного проще/понятнее — весь код (за исключением учетных данных учетной записи хранилища) присутствует. - person Dominic Betts; 12.12.2013