Jak korzystać z usługi Azure Table Storage lub interfejsu API tabel usługi Azure Cosmos DB przy użyciu platformy Node.jsHow to use Azure Table storage or the Azure Cosmos DB Table API from Node.js

Porada

Zawartość tego artykułu dotyczy magazynu tabel Azure i interfejsu API tabeli w usłudze Azure Cosmos DB.The content in this article applies to Azure Table storage and the Azure Cosmos DB Table API. Interfejs API tabeli w usłudze Azure Cosmos DB jest ofertą Premium służącą do przechowywania tabel, która zapewnia tabele zoptymalizowane pod kątem przepływności, ich globalną dystrybucję i automatyczne indeksy pomocnicze.The Azure Cosmos DB Table API is a premium offering for table storage that offers throughput-optimized tables, global distribution, and automatic secondary indexes.

OmówienieOverview

W tym artykule przedstawiono sposób wykonywania typowych scenariuszy przy użyciu usługi Azure Storage Table lub usługi Azure Cosmos DB w aplikacji platformy Node.js.This article shows how to perform common scenarios using Azure Storage Table service or Azure Cosmos DB in a Node.js application.

Tworzenie konta usługi AzureCreate an Azure service account

Do pracy z tabelami można używać usługi Azure Table Storage lub Azure Cosmos DB.You can work with tables using Azure Table storage or Azure Cosmos DB. Aby dowiedzieć się więcej o różnicach między usługami, zobacz Oferty tabel .To learn more about the differences between the services, see Table offerings. Aby móc korzystać z wybranej usługi, musisz w niej utworzyć konto.You'll need to create an account for the service you're going to use.

Tworzenie konta usługi Azure StorageCreate an Azure storage account

Najprostszym sposobem utworzenia konta magazynu platformy Azure jest użycie witryny Azure portal.The easiest way to create an Azure storage account is by using the Azure portal. Więcej informacji można znaleźć w temacie Tworzenie konta magazynu.To learn more, see Create a storage account.

Możesz utworzyć konto usługi Azure Storage przy użyciu programu Azure PowerShell lub interfejsu wiersza polecenia platformy Azure.You can also create an Azure storage account by using Azure PowerShell or Azure CLI.

Jeśli nie chcesz teraz tworzyć konta magazynu, możesz także użyć emulatora usługi Azure Storage do uruchomienia i testowania kodu w środowisku lokalnym.If you prefer not to create a storage account at this time, you can also use the Azure storage emulator to run and test your code in a local environment. Aby uzyskać więcej informacji, zobacz Używanie emulatora magazynu platformy Azure do tworzenia i testowania.For more information, see Use the Azure storage emulator for development and testing.

Tworzenie konta interfejsu API tabel usługi Azure Cosmos DBCreate an Azure Cosmos DB Table API account

Aby uzyskać instrukcje dotyczące tworzenia konta interfejsu API tabeli usługi Azure Cosmos DB, zobacz Tworzenie konta bazy danych.For instructions on creating an Azure Cosmos DB Table API account, see Create a database account.

Konfigurowanie aplikacji w celu uzyskiwania dostępu do usługi Azure Storage lub interfejsu API tabel usługi Azure Cosmos DBConfigure your application to access Azure Storage or the Azure Cosmos DB Table API

Aby użyć usługi Azure Storage lub Azure Cosmos DB, należy skorzystać z zestawu Azure Storage SDK dla platformy Node.js, który zawiera zestaw wygodnych bibliotek służących do komunikacji z usługami Storage REST.To use Azure Storage or Azure Cosmos DB, you need the Azure Storage SDK for Node.js, which includes a set of convenience libraries that communicate with the Storage REST services.

Instalowanie menedżera NPM (Node Package Manager)Use Node Package Manager (NPM) to install the package

  1. Użyj interfejsu wiersza polecenia, takiego jak PowerShell (Windows), Terminal (Mac) lub Bash (Unix), i przejdź do folderu, w którym utworzono aplikację.Use a command-line interface such as PowerShell (Windows), Terminal (Mac), or Bash (Unix), and navigate to the folder where you created your application.

  2. Wpisz ciąg npm install azure-storage w oknie polecenia.Type npm install azure-storage in the command window. Dane wyjściowe polecenia są podobne do poniższego przykładu.Output from the command is similar to the following example.

    azure-storage@0.5.0 node_modules\azure-storage
    +-- extend@1.2.1
    +-- xmlbuilder@0.4.3
    +-- mime@1.2.11
    +-- node-uuid@1.4.3
    +-- validator@3.22.2
    +-- underscore@1.4.4
    +-- readable-stream@1.0.33 (string_decoder@0.10.31, isarray@0.0.1, inherits@2.0.1, core-util-is@1.0.1)
    +-- xml2js@0.2.7 (sax@0.5.2)
    +-- request@2.57.0 (caseless@0.10.0, aws-sign2@0.5.0, forever-agent@0.6.1, stringstream@0.0.4, oauth-sign@0.8.0, tunnel-agent@0.4.1, isstream@0.1.2, json-stringify-safe@5.0.1, bl@0.9.4, combined-stream@1.0.5, qs@3.1.0, mime-types@2.0.14, form-data@0.2.0, http-signature@0.11.0, tough-cookie@2.0.0, hawk@2.3.1, har-validator@1.8.0)
    
  3. Możesz ręcznie uruchomić polecenie ls, aby sprawdzić, czy utworzono folder node_modules.You can manually run the ls command to verify that a node_modules folder was created. Wewnątrz tego folderu znajduje się pakiet azure-storage zawierający biblioteki wymagane do uzyskiwania dostępu do magazynu.Inside that folder you will find the azure-storage package, which contains the libraries you need to access storage.

Importowanie pakietuImport the package

Dodaj następujący kod na początku pliku server.js w aplikacji:Add the following code to the top of the server.js file in your application:

var azure = require('azure-storage');

Dodawanie połączenia z usługą Azure StorageAdd an Azure Storage connection

Moduł platformy Azure odczytuje zmienne środowiskowe AZURE_STORAGE_ACCOUNT i AZURE_STORAGE_ACCESS_KEY lub AZURE_STORAGE_CONNECTION_STRING, aby uzyskać informacje wymagane do nawiązania połączenia z kontem usługi Azure Storage.The Azure module reads the environment variables AZURE_STORAGE_ACCOUNT and AZURE_STORAGE_ACCESS_KEY, or AZURE_STORAGE_CONNECTION_STRING for information required to connect to your Azure Storage account. Jeśli te zmienne środowiskowe nie zostały ustawione, należy określić informacje o koncie podczas wywoływania obiektu TableService.If these environment variables are not set, you must specify the account information when calling TableService. Na przykład poniższy kod tworzy obiekt TableService:For example, the following code creates a TableService object:

var tableSvc = azure.createTableService('myaccount', 'myaccesskey');

Dodawanie połączenia z usługą Azure Cosmos DBAdd an Azure Cosmos DB connection

Aby dodać połączenie z usługą Azure Cosmos DB, utwórz obiekt TableService i określ nazwę konta, klucz podstawowy oraz punkt końcowy.To add an Azure Cosmos DB connection, create a TableService object and specify your account name, primary key, and endpoint. Te wartości można skopiować z parametrypołączenia ustawienia > w witrynie Azure portal dla konta usługi Cosmos DB.You can copy these values from Settings > Connection String in the Azure portal for your Cosmos DB account. Przykład:For example:

var tableSvc = azure.createTableService('myaccount', 'myprimarykey', 'myendpoint');

Tworzenie tabeliCreate a table

Poniższy kod tworzy obiekt TableService i używa go do utworzenia nowej tabeli.The following code creates a TableService object and uses it to create a new table.

var tableSvc = azure.createTableService();

Wywołanie elementu createTableIfNotExists tworzy nową tabelę o określonej nazwie, jeśli jeszcze nie istnieje.The call to createTableIfNotExists creates a new table with the specified name if it does not already exist. W poniższym przykładzie jest tworzona nowa tabela o nazwie „mytable”, jeśli jeszcze nie istnieje:The following example creates a new table named 'mytable' if it does not already exist:

tableSvc.createTableIfNotExists('mytable', function(error, result, response){
  if(!error){
    // Table exists or created
  }
});

Element result.created ma wartość true w przypadku tworzenia nowej tabeli lub wartość false, jeśli tabela już istnieje.The result.created is true if a new table is created, and false if the table already exists. Element response zawiera informacje dotyczące żądania.The response contains information about the request.

FiltryFilters

Do operacji wykonywanych przy użyciu obiektu TableService można zastosować filtrowanie opcjonalne.You can apply optional filtering to operations performed using TableService. Operacje filtrowania mogą obejmować rejestrowanie, automatyczne ponownych prób itp. Filtry są obiektami, które implementują metodę z podpisem:Filtering operations can include logging, automatic retries, etc. Filters are objects that implement a method with the signature:

function handle (requestOptions, next)

Po zakończeniu przetwarzania wstępnego opcji żądań metoda musi wywołać element next, przekazując wywołanie zwrotne z następującą sygnaturą:After doing its preprocessing on the request options, the method must call next, passing a callback with the following signature:

function (returnObject, finalCallback, next)

W tym wywołaniu zwrotnym i po zakończeniu przetwarzania elementu returnObject (odpowiedzi z żądania do serwera) wywołanie zwrotne musi wywołać element next, jeśli istnieje, aby kontynuować przetwarzanie inych filtrów, lub w przeciwnym razie po prostu wywołać element finalCallback, aby zakończyć wywoływanie usługi.In this callback, and after processing the returnObject (the response from the request to the server), the callback must either invoke next if it exists to continue processing other filters or simply invoke finalCallback otherwise to end the service invocation.

Dwa filtry, które implementują logikę ponawiania prób, wchodzą w skład zestawu Azure SDK dla platformy Node.js: ExponentialRetryPolicyFilter i LinearRetryPolicyFilter.Two filters that implement retry logic are included with the Azure SDK for Node.js, ExponentialRetryPolicyFilter and LinearRetryPolicyFilter. Poniższy kod tworzy obiekt TableService, który używa filtru ExponentialRetryPolicyFilter:The following creates a TableService object that uses the ExponentialRetryPolicyFilter:

var retryOperations = new azure.ExponentialRetryPolicyFilter();
var tableSvc = azure.createTableService().withFilter(retryOperations);

Dodawanie jednostki do tabeliAdd an entity to a table

Aby dodać jednostkę, najpierw utwórz obiekt, który definiuje właściwości jednostki.To add an entity, first create an object that defines your entity properties. Wszystkie jednostki muszą zawierać elementy PartitionKey i RowKey, które są unikatowymi identyfikatorami jednostki.All entities must contain a PartitionKey and RowKey, which are unique identifiers for the entity.

  • PartitionKey — określa partycję, w której jest przechowywana jednostka.PartitionKey - Determines the partition in which the entity is stored.
  • RowKey — unikatowo identyfikuje jednostkę w partycji.RowKey - Uniquely identifies the entity within the partition.

Klucze PartitionKey i RowKey muszą być wartościami ciągów.Both PartitionKey and RowKey must be string values. Aby uzyskać więcej informacji, zobacz Understanding the Table Service Data Model (Omówienie modelu danych usługi Table Service).For more information, see Understanding the Table Service Data Model.

Poniżej znajduje się przykład definiowania jednostki.The following is an example of defining an entity. Pamiętaj, że element dueDate jest definiowany jako typ elementu Edm.DateTime.Note that dueDate is defined as a type of Edm.DateTime. Określenie typu jest opcjonalne — w przypadku rezygnacji typy zostaną wywnioskowane.Specifying the type is optional, and types are inferred if not specified.

var task = {
  PartitionKey: {'_':'hometasks'},
  RowKey: {'_': '1'},
  description: {'_':'take out the trash'},
  dueDate: {'_':new Date(2015, 6, 20), '$':'Edm.DateTime'}
};

Uwaga

Każdy rekord zawiera również pole Znacznik czasu, którego wartość jest ustawiana przez platformę Azure w momencie wstawienia lub zaktualizowania jednostki.There is also a Timestamp field for each record, which is set by Azure when an entity is inserted or updated.

Do tworzenia jednostek można również użyć elementu entityGenerator.You can also use the entityGenerator to create entities. W poniższym przykładzie ta sama jednostka zadania jest tworzona przy użyciu elementu entityGenerator.The following example creates the same task entity using the entityGenerator.

var entGen = azure.TableUtilities.entityGenerator;
var task = {
  PartitionKey: entGen.String('hometasks'),
  RowKey: entGen.String('1'),
  description: entGen.String('take out the trash'),
  dueDate: entGen.DateTime(new Date(Date.UTC(2015, 6, 20))),
};

Aby dodać jednostkę do tabeli, przekaż obiekt jednostki do metody insertEntity.To add an entity to your table, pass the entity object to the insertEntity method.

tableSvc.insertEntity('mytable',task, function (error, result, response) {
  if(!error){
    // Entity inserted
  }
});

Jeśli operacja zakończy się pomyślnie, element result będzie zawierać tag ETag wstawionego rekordu, a element response będzie zawierać informacje na temat operacji.If the operation is successful, result contains the ETag of the inserted record and response contains information about the operation.

Przykładowa odpowiedź:Example response:

{ '.metadata': { etag: 'W/"datetime\'2015-02-25T01%3A22%3A22.5Z\'"' } }

Uwaga

Domyślnie element insertEntity nie zwraca wstawionej jednostki jako części informacji elementu response.By default, insertEntity does not return the inserted entity as part of the response information. Jeśli planujesz wykonywanie innych operacji w obrębie tej jednostki lub chcesz buforować informacje, może być przydatne ich zwracanie jako części elementu result.If you plan on performing other operations on this entity, or want to cache the information, it can be useful to have it returned as part of the result. W tym celu można włączyć element echoContent w następujący sposób:You can do this by enabling echoContent as follows:

tableSvc.insertEntity('mytable', task, {echoContent: true}, function (error, result, response) {...}

Aktualizowanie jednostkiUpdate an entity

Istnieje kilka metod aktualizowania istniejącej jednostki:There are multiple methods available to update an existing entity:

  • replaceEntity — aktualizuje istniejącą jednostkę przez jej zastąpienie.replaceEntity - Updates an existing entity by replacing it.
  • mergeEntity — aktualizuje istniejącą jednostkę przez scalenie nowych wartości właściwości z istniejącą jednostką.mergeEntity - Updates an existing entity by merging new property values into the existing entity.
  • insertOrReplaceEntity — aktualizuje istniejącą jednostkę przez jej zastąpienie.insertOrReplaceEntity - Updates an existing entity by replacing it. Jeśli żadna jednostka nie istnieje, zostanie wstawiona nowa jednostka.If no entity exists, a new one will be inserted.
  • insertOrMergeEntity — aktualizuje istniejącą jednostkę przez scalenie nowych wartości właściwości z istniejącą jednostką.insertOrMergeEntity - Updates an existing entity by merging new property values into the existing. Jeśli żadna jednostka nie istnieje, zostanie wstawiona nowa jednostka.If no entity exists, a new one will be inserted.

W poniższym przykładzie przedstawiono aktualizowanie jednostki przy użyciu metody replaceEntity:The following example demonstrates updating an entity using replaceEntity:

tableSvc.replaceEntity('mytable', updatedTask, function(error, result, response){
  if(!error) {
    // Entity updated
  }
});

Uwaga

Domyślnie podczas aktualizowania jednostki nie odbywa się sprawdzenie, czy aktualizowane dane zostały wcześniej zmodyfikowane przez inny proces.By default, updating an entity does not check to see if the data being updated has previously been modified by another process. Aby obsługiwać równoczesne aktualizacje:To support concurrent updates:

  1. Pobierz tag ETag aktualizowanego obiektu.Get the ETag of the object being updated. Ten tag jest zwracany jako część elementu response dla dowolnej operacji powiązanej z jednostką i można go pobrać za pośrednictwem elementu response['.metadata'].etag.This is returned as part of the response for any entity-related operation and can be retrieved through response['.metadata'].etag.

  2. Podczas wykonywania operacji aktualizowania jednostki dodaj informacje tagu ETag wcześniej pobrane do nowej jednostki.When performing an update operation on an entity, add the ETag information previously retrieved to the new entity. Przykład:For example:

    entity2['.metadata'].etag = currentEtag;entity2['.metadata'].etag = currentEtag;

  3. Wykonaj operację aktualizacji.Perform the update operation. Jeśli jednostka została zmodyfikowana od czasu pobrania wartości tagu ETag, takiej jak inne wystąpienie aplikacji, element error jest zwracany wraz z informacją o tym, że warunek aktualizacji określony w żądaniu nie został spełniony.If the entity has been modified since you retrieved the ETag value, such as another instance of your application, an error is returned stating that the update condition specified in the request was not satisfied.

W przypadku metod replaceEntity i mergeEntity, jeśli aktualizowana jednostka nie istnieje, operacja aktualizowania kończy się niepowodzeniem. W związku z tym, jeśli chcesz przechowywać jednostkę niezależnie od tego, czy już istnieje, użyj metody insertOrReplaceEntity lub insertOrMergeEntity.With replaceEntity and mergeEntity, if the entity that is being updated doesn't exist, then the update operation fails; therefore, if you want to store an entity regardless of whether it already exists, use insertOrReplaceEntity or insertOrMergeEntity.

Element result pomyślnie zakończonych operacji aktualizowania zawiera tag Etag zaktualizowanej jednostki.The result for successful update operations contains the Etag of the updated entity.

Praca z grupami jednostekWork with groups of entities

Czasami warto przesłać jednocześnie wiele operacji w partii, aby zapewnić niepodzielne przetwarzanie przez serwer.Sometimes it makes sense to submit multiple operations together in a batch to ensure atomic processing by the server. Aby osiągnąć ten cel, należy utworzyć partię przy użyciu klasy TableBatch, a następnie użyć metody executeBatch obiektu TableService w celu wykonania operacji wsadowych.To accomplish that, use the TableBatch class to create a batch, and then use the executeBatch method of TableService to perform the batched operations.

W poniższym przykładzie przedstawiono przesyłanie dwóch jednostek w partii:The following example demonstrates submitting two entities in a batch:

var task1 = {
  PartitionKey: {'_':'hometasks'},
  RowKey: {'_': '1'},
  description: {'_':'Take out the trash'},
  dueDate: {'_':new Date(2015, 6, 20)}
};
var task2 = {
  PartitionKey: {'_':'hometasks'},
  RowKey: {'_': '2'},
  description: {'_':'Wash the dishes'},
  dueDate: {'_':new Date(2015, 6, 20)}
};

var batch = new azure.TableBatch();

batch.insertEntity(task1, {echoContent: true});
batch.insertEntity(task2, {echoContent: true});

tableSvc.executeBatch('mytable', batch, function (error, result, response) {
  if(!error) {
    // Batch completed
  }
});

W przypadku operacji wsadowych zakończonych pomyślnie element result zawiera informacje dotyczące każdej operacji w partii.For successful batch operations, result contains information for each operation in the batch.

Praca z operacjami wsadowymiWork with batched operations

Operacje dodane do partii można sprawdzić, wyświetlając właściwość operations.You can inspect operations added to a batch by viewing the operations property. Można także użyć następujących metod podczas pracy z operacjami:You can also use the following methods to work with operations:

  • clear — usuwa wszystkie operacje z partii.clear - Clears all operations from a batch.
  • getOperations — pobiera operację z partii.getOperations - Gets an operation from the batch.
  • hasOperations — zwraca wartość true, jeśli partia zawiera operacje.hasOperations - Returns true if the batch contains operations.
  • removeOperations — usuwa operację.removeOperations - Removes an operation.
  • size — zwraca liczbę operacji w partii.size - Returns the number of operations in the batch.

Pobieranie jednostek według kluczaRetrieve an entity by key

Aby zwrócić określoną jednostkę na podstawie elementów PartitionKey i RowKey, użyj metody retrieveEntity.To return a specific entity based on the PartitionKey and RowKey, use the retrieveEntity method.

tableSvc.retrieveEntity('mytable', 'hometasks', '1', function(error, result, response){
  if(!error){
    // result contains the entity
  }
});

Po ukończeniu tej operacji element result zawiera jednostkę.After this operation is complete, result contains the entity.

Wykonywanie zapytania względem zestawu jednostekQuery a set of entities

Aby wykonać zapytanie dotyczące tabeli, należy użyć obiektu TableQuery w celu skompilowania wyrażenia zapytania przy użyciu następujących klauzul:To query a table, use the TableQuery object to build up a query expression using the following clauses:

  • select — pola do zwrócenia z zapytania.select - The fields to be returned from the query.

  • where — klauzula where.where - The where clause.

    • and — warunek where and.and - An and where condition.
    • or — warunek where or.or - An or where condition.
  • top — liczba elementów do pobrania.top - The number of items to fetch.

W poniższym przykładzie jest tworzone zapytanie, które zwraca pięć pierwszych elementów z kluczem PartitionKey „hometasks”.The following example builds a query that returns the top five items with a PartitionKey of 'hometasks'.

var query = new azure.TableQuery()
  .top(5)
  .where('PartitionKey eq ?', 'hometasks');

Ponieważ klauzula select nie jest używana, są zwracane wszystkie pola.Because select is not used, all fields are returned. Aby wykonać zapytanie dotyczące tabeli, należy użyć elementu queryEntities.To perform the query against a table, use queryEntities. W poniższym przykładzie użyto tego zapytania w celu zwrócenia jednostek z tabeli „mytable”.The following example uses this query to return entities from 'mytable'.

tableSvc.queryEntities('mytable',query, null, function(error, result, response) {
  if(!error) {
    // query was successful
  }
});

W przypadku powodzenia element result.entries będzie zawierać tablicę jednostek pasujących do zapytania.If successful, result.entries contains an array of entities that match the query. Jeśli zapytanie nie mogło zwrócić wszystkich jednostek, element result.continuationToken ma wartość inną niż null i może być używany jako trzeci parametr elementu queryEntities do pobierania większej liczby wyników.If the query was unable to return all entities, result.continuationToken is non-null and can be used as the third parameter of queryEntities to retrieve more results. W zapytaniu początkowym można użyć wartości null w przypadku trzeciego parametru.For the initial query, use null for the third parameter.

Tworzenie zapytania do podzbioru właściwości jednostkiQuery a subset of entity properties

Za pomocą zapytania wykonywanego względem tabeli można pobrać tylko kilka pól z jednostki.A query to a table can retrieve just a few fields from an entity. Redukuje to przepustowość i może poprawiać wydajność zapytań, zwłaszcza w przypadku dużych jednostek.This reduces bandwidth and can improve query performance, especially for large entities. Użyj klauzuli select i przekaż nazwy pól do zwrócenia.Use the select clause and pass the names of the fields to return. Na przykład poniższe zapytanie zwraca tylko wartości pól description i dueDate.For example, the following query returns only the description and dueDate fields.

var query = new azure.TableQuery()
  .select(['description', 'dueDate'])
  .top(5)
  .where('PartitionKey eq ?', 'hometasks');

Usuwanie jednostkiDelete an entity

Jednostkę można usunąć za pomocą kluczy partycji i wierszy.You can delete an entity using its partition and row keys. W tym przykładzie obiekt task1 zawiera wartości RowKey i PartitionKey jednostki do usunięcia.In this example, the task1 object contains the RowKey and PartitionKey values of the entity to delete. Następnie obiekt jest przekazywany do metody deleteEntity.Then the object is passed to the deleteEntity method.

var task = {
  PartitionKey: {'_':'hometasks'},
  RowKey: {'_': '1'}
};

tableSvc.deleteEntity('mytable', task, function(error, response){
  if(!error) {
    // Entity deleted
  }
});

Uwaga

Rozważ użycie tagów ETag podczas usuwania elementów, aby upewnić się, że element nie został zmodyfikowany przez inny proces.Consider using ETags when deleting items, to ensure that the item hasn't been modified by another process. Aby uzyskać informacje na temat używania tagów Etag, zobacz Aktualizowanie jednostki.See Update an entity for information on using ETags.

Usuwanie tabeliDelete a table

Poniższy kod usuwa tabelę z konta magazynu.The following code deletes a table from a storage account.

tableSvc.deleteTable('mytable', function(error, response){
    if(!error){
        // Table deleted
    }
});

Jeśli nie masz pewności, czy tabela istnieje, użyj metody deleteTableIfExists.If you are uncertain whether the table exists, use deleteTableIfExists.

Korzystanie z tokenów kontynuacjiUse continuation tokens

W przypadku wykonywania zapytań dotyczących tabel z dużą liczbą wyników należy poszukać tokenów kontynuacji.When you are querying tables for large amounts of results, look for continuation tokens. Mogą istnieć duże ilości danych dostępnych dla zapytania, o których możesz nie wiedzieć, jeśli nie skompilujesz rozpoznawania obecności tokenu kontynuacji.There may be large amounts of data available for your query that you might not realize if you do not build to recognize when a continuation token is present.

Obiekt results zwracany w przypadku wykonywania zapytań dotyczących jednostek ustawia właściwość continuationToken, gdy taki token istnieje.The results object returned during querying entities sets a continuationToken property when such a token is present. Możesz go następnie użyć podczas wykonywania zapytania, aby kontynuować poruszanie się w obrębie jednostek tabeli i partycji.You can then use this when performing a query to continue to move across the partition and table entities.

Podczas wykonywania zapytania możesz określić parametr continuationToken między wystąpieniem obiektu zapytania i funkcją wywołania zwrotnego:When querying, you can provide a continuationToken parameter between the query object instance and the callback function:

var nextContinuationToken = null;
dc.table.queryEntities(tableName,
    query,
    nextContinuationToken,
    function (error, results) {
        if (error) throw error;

        // iterate through results.entries with results

        if (results.continuationToken) {
            nextContinuationToken = results.continuationToken;
        }

    });

Jeśli sprawdzasz obiekt continuationToken, znajdziesz właściwości, takie jak nextPartitionKey, nextRowKey i targetLocation, które mogą służyć do iterowania w obrębie wszystkich wyników.If you inspect the continuationToken object, you will find properties such as nextPartitionKey, nextRowKey and targetLocation, which can be used to iterate through all the results.

Można również top użyć continuationToken wraz z ustawić rozmiar strony.You can also use top along with continuationToken to set the page size.

Praca z sygnaturami dostępu współdzielonegoWork with shared access signatures

Sygnatury dostępu współdzielonego (SAS) to bezpieczny sposób zapewnienia szczegółowego dostępu do tabel bez podawania kluczy ani nazwy konta usługi Storage.Shared access signatures (SAS) are a secure way to provide granular access to tables without providing your Storage account name or keys. Sygnatury dostępu współdzielonego są często używane do udzielania ograniczonych praw dostępu do danych, takich jak zezwalanie aplikacji mobilnej na wykonywanie zapytań dotyczących rekordów.SAS are often used to provide limited access to your data, such as allowing a mobile app to query records.

Aplikacja zaufana, taka jak usługa oparta na chmurze, generuje sygnaturę dostępu współdzielonego przy użyciu elementu generateSharedAccessSignature obiektu TableService i udostępnia ją niezaufanej lub częściowo zaufanej aplikacji, takiej jak aplikacja mobilna.A trusted application such as a cloud-based service generates a SAS using the generateSharedAccessSignature of the TableService, and provides it to an untrusted or semi-trusted application such as a mobile app. Sygnatura dostępu współdzielonego jest generowana przy użyciu zasad opisujących daty rozpoczęcia i zakończenia okresu, w którym ta sygnatura obowiązuje, a także poziom dostępu przyznany właścicielowi sygnatury dostępu współdzielonego.The SAS is generated using a policy, which describes the start and end dates during which the SAS is valid, as well as the access level granted to the SAS holder.

W poniższym przykładzie są generowane nowe zasady dostępu współdzielonego, które umożliwią właścicielowi sygnatury dostępu współdzielonego wykonanie zapytania („r”) dotyczącego tabeli. Ich ważność wygaśnie po upływie 100 minut od utworzenia.The following example generates a new shared access policy that will allow the SAS holder to query ('r') the table, and expires 100 minutes after the time it is created.

var startDate = new Date();
var expiryDate = new Date(startDate);
expiryDate.setMinutes(startDate.getMinutes() + 100);
startDate.setMinutes(startDate.getMinutes() - 100);

var sharedAccessPolicy = {
  AccessPolicy: {
    Permissions: azure.TableUtilities.SharedAccessPermissions.QUERY,
    Start: startDate,
    Expiry: expiryDate
  },
};

var tableSAS = tableSvc.generateSharedAccessSignature('mytable', sharedAccessPolicy);
var host = tableSvc.host;

Należy również pamiętać o podaniu informacji o hoście, ponieważ są one wymagane, gdy właściciel sygnatury dostępu współdzielonego próbuje uzyskać dostęp do tabeli.Note that you must also provide the host information, as it is required when the SAS holder attempts to access the table.

Następnie aplikacja kliencka używa sygnatury dostępu współdzielonego z elementem TableServiceWithSAS w celu wykonywania operacji względem tabeli.The client application then uses the SAS with TableServiceWithSAS to perform operations against the table. W poniższym przykładzie następuje połączenie z tabelą i wykonanie zapytania.The following example connects to the table and performs a query. Zobacz Udzielanie ograniczonego dostępu do zasobów usługi Azure Storage przy użyciu sygnatur dostępu współdzielonego (SAS) artykuł formatu tabeliSAS.See Grant limited access to Azure Storage resources using shared access signatures (SAS) article for the format of tableSAS.

// Note in the following command, host is in the format: `https://<your_storage_account_name>.table.core.windows.net` and the tableSAS is in the format: `sv=2018-03-28&si=saspolicy&tn=mytable&sig=9aCzs76n0E7y5BpEi2GvsSv433BZa22leDOZXX%2BXXIU%3D`;

var sharedTableService = azure.createTableServiceWithSas(host, tableSAS);
var query = azure.TableQuery()
  .where('PartitionKey eq ?', 'hometasks');

sharedTableService.queryEntities(query, null, function(error, result, response) {
  if(!error) {
    // result contains the entities
  }
});

Ponieważ sygnatura dostępu współdzielonego została wygenerowana z dostępem tylko do zapytania, próba wstawienia, zaktualizowania lub usunięcia jednostek spowoduje zwrócenie błędu.Because the SAS was generated with only query access, an error is returned if you attempt to insert, update, or delete entities.

Listy kontroli dostępuAccess Control Lists

Do ustawienia zasad dostępu powiązanych z sygnaturą dostępu współdzielonego można również użyć listy kontroli dostępu (ACL, Access Control List).You can also use an Access Control List (ACL) to set the access policy for a SAS. Jest to przydatne, jeśli chcesz umożliwić wielu klientom dostęp do tabeli, ale uwzględnia różne zasady dostępu dla poszczególnych klientów.This is useful if you want to allow multiple clients to access the table, but provide different access policies for each client.

Lista ACL jest implementowana przy użyciu tablicy zasad dostępu z identyfikatorem skojarzonym z poszczególnymi zasadami.An ACL is implemented using an array of access policies, with an ID associated with each policy. W poniższym przykładzie zdefiniowano dwie zasady, odpowiednio dla użytkowników „user1” i „user2”:The following example defines two policies, one for 'user1' and one for 'user2':

var sharedAccessPolicy = {
  user1: {
    Permissions: azure.TableUtilities.SharedAccessPermissions.QUERY,
    Start: startDate,
    Expiry: expiryDate
  },
  user2: {
    Permissions: azure.TableUtilities.SharedAccessPermissions.ADD,
    Start: startDate,
    Expiry: expiryDate
  }
};

W poniższym przykładzie bieżąca lista ACL jest pobierana do tabeli hometasks, a następnie następuje dodanie nowych zasad za pomocą elementu setTableAcl.The following example gets the current ACL for the hometasks table, and then adds the new policies using setTableAcl. W przypadku takiego podejścia:This approach allows:

var extend = require('extend');
tableSvc.getTableAcl('hometasks', function(error, result, response) {
if(!error){
    var newSignedIdentifiers = extend(true, result.signedIdentifiers, sharedAccessPolicy);
    tableSvc.setTableAcl('hometasks', newSignedIdentifiers, function(error, result, response){
      if(!error){
        // ACL set
      }
    });
  }
});

Po ustawieniu listy ACL można następnie utworzyć sygnaturę dostępu współdzielonego na podstawie identyfikatora zasad.After the ACL has been set, you can then create a SAS based on the ID for a policy. W poniższym przykładzie jest tworzona nowa sygnatura dostępu współdzielonego dla użytkownika „user2”:The following example creates a new SAS for 'user2':

tableSAS = tableSvc.generateSharedAccessSignature('hometasks', { Id: 'user2' });

Następne krokiNext steps

Więcej informacji zawierają poniższe zasoby.For more information, see the following resources.