Verwenden von Azure Table Storage oder der Azure Cosmos DB-Tabellen-API über Node.jsHow to use Azure Table storage or the Azure Cosmos DB Table API from Node.js

Tipp

Der Inhalt in diesem Artikel gilt für Azure-Tabellenspeicher und für die Azure Cosmos DB-Tabellen-API.The content in this article applies to Azure Table storage and the Azure Cosmos DB Table API. Die Azure Cosmos DB-Tabellen-API ist ein Premiumangebot für Tabellenspeicher und bietet Tabellen mit optimiertem Durchsatz, globale Verteilung und automatische sekundäre Indizes.The Azure Cosmos DB Table API is a premium offering for table storage that offers throughput-optimized tables, global distribution, and automatic secondary indexes.

ÜbersichtOverview

In diesem Artikel erfahren Sie, wie Sie allgemeine Szenarien mit dem Azure Storage-Tabellendienst oder Azure Cosmos DB in einer Node.js-Anwendung durchführen.This article shows how to perform common scenarios using Azure Storage Table service or Azure Cosmos DB in a Node.js application.

Erstellen eines Azure-DienstkontosCreate an Azure service account

Sie können in Azure Table Storage oder in Azure Cosmos DB mit Tabellen arbeiten.You can work with tables using Azure Table storage or Azure Cosmos DB. Informationen zu den Unterschieden zwischen den Diensten finden Sie unter Tabellenangebote.To learn more about the differences between the services, see Table offerings. Sie müssen ein Konto für den Dienst erstellen, den Sie verwenden werden.You'll need to create an account for the service you're going to use.

Erstellen eines Azure-SpeicherkontosCreate an Azure storage account

Ein Azure-Speicherkonto erstellen Sie am einfachsten im Azure-Portal.The easiest way to create an Azure storage account is by using the Azure portal. Weitere Informationen finden Sie unter Erstellen von Speicherkonten.To learn more, see Create a storage account.

Sie können ein Azure-Speicherkonto auch mit Azure PowerShell oder mit der Azure CLI erstellen.You can also create an Azure storage account by using Azure PowerShell or Azure CLI.

Wenn Sie zu diesem Zeitpunkt kein Speicherkonto erstellen möchten, können Sie auch den Azure-Speicheremulator zum Ausführen und Testen Ihres Codes in einer lokalen Umgebung verwenden.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. Weitere Informationen finden Sie unter Einsatz des Azure-Speicheremulators für Entwicklung und Tests.For more information, see Use the Azure storage emulator for development and testing.

Erstellen eines Kontos für die Azure Cosmos DB-Tabellen-APICreate an Azure Cosmos DB Table API account

Anweisungen zum Erstellen eines Kontos für die Azure Cosmos DB-Tabellen-API finden Sie unter Schnellstart: Erstellen einer Tabellen-API-App per .NET SDK und Azure Cosmos DB.For instructions on creating an Azure Cosmos DB Table API account, see Create a database account.

Konfigurieren Ihrer Anwendung für den Zugriff auf Azure Storage oder die Azure Cosmos DB-Tabellen-APIConfigure your application to access Azure Storage or the Azure Cosmos DB Table API

Um Azure Storage oder Azure Cosmos DB verwenden zu können, müssen Sie das Azure Storage SDK für Node.js herunterladen. Es enthält eine Reihe von Bibliotheken, die mit den REST-Speicherdiensten kommunizieren.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.

Verwenden des Node-Paket-Managers (NPM) zum Installieren des PaketsUse Node Package Manager (NPM) to install the package

  1. Verwenden Sie eine Befehlszeilenschnittstelle, z. B. PowerShell (Windows), Terminal (Mac) oder Bash (Unix), und navigieren Sie zum Ordner, in dem Sie die Beispielanwendung erstellt haben.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. Geben Sie npm install azure-storage in das Befehlsfenster ein.Type npm install azure-storage in the command window. Die Ausgabe des Befehls ähnelt dem folgenden Beispiel.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. Sie können den Befehl ls manuell ausführen, um zu überprüfen, ob der Ordner node_modules erstellt wurde.You can manually run the ls command to verify that a node_modules folder was created. In diesem Ordner finden Sie das Paket azure-storage mit den Bibliotheken, die Sie benötigen, um auf den Speicher zuzugreifen.Inside that folder you will find the azure-storage package, which contains the libraries you need to access storage.

Importieren des PaketsImport the package

Fügen Sie den folgenden Code am Anfang der Datei server.js in der Anwendung hinzu:Add the following code to the top of the server.js file in your application:

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

Hinzufügen einer Azure Storage-VerbindungAdd an Azure Storage connection

Das Azure-Modul liest in den Umgebungsvariablen AZURE_STORAGE_ACCOUNT und AZURE_STORAGE_ACCESS_KEY oder AZURE_STORAGE_CONNECTION_STRING die Informationen, die zum Herstellen einer Verbindung mit Ihrem Azure Storage-Konto erforderlich sind.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. Wenn diese Umgebungsvariablen nicht festgelegt wurden, müssen Sie die Kontoinformationen beim Aufruf von TableServiceangeben.If these environment variables are not set, you must specify the account information when calling TableService. Der folgende Code erstellt beispielsweise ein TableService-Objekt:For example, the following code creates a TableService object:

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

Hinzufügen einer Azure Cosmos DB-VerbindungAdd an Azure Cosmos DB connection

Wenn Sie eine Verbindung zu Azure Cosmos DB hinzufügen möchten, erstellen Sie ein TableService-Objekt, und geben Sie Ihren Kontonamen, den Primärschlüssel und den Endpunkt an.To add an Azure Cosmos DB connection, create a TableService object and specify your account name, primary key, and endpoint. Sie können diese Werte aus Einstellungen > Verbindungszeichenfolge im Azure-Portal für Ihr Cosmos DB-Konto kopieren.You can copy these values from Settings > Connection String in the Azure portal for your Cosmos DB account. Beispiel:For example:

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

Erstellen einer TabelleCreate a table

Mit dem folgenden Code wird ein TableService -Objekt erstellt und zum Erstellen einer neuen Tabelle verwendet.The following code creates a TableService object and uses it to create a new table.

var tableSvc = azure.createTableService();

Wenn Sie createTableIfNotExists aufrufen, wird eine neue Tabelle mit dem angegebenen Namen erstellt, sofern sie nicht bereits vorhanden ist.The call to createTableIfNotExists creates a new table with the specified name if it does not already exist. Im folgenden Beispiel wird eine neue Tabelle namens 'mytable' erstellt, wenn diese noch nicht vorhanden ist: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
  }
});

Der Wert für result.created lautet true, wenn eine neue Tabelle erstellt wird, und false, wenn die Tabelle bereits vorhanden ist.The result.created is true if a new table is created, and false if the table already exists. response enthält Informationen über die Anforderung.The response contains information about the request.

FilterFilters

Sie können optionale Filter auf Vorgänge anwenden, die mithilfe von TableService ausgeführt werden.You can apply optional filtering to operations performed using TableService. Zu Filtervorgängen zählen z.B. Protokollierung, automatische Wiederholung usw. Filter sind Objekte, die eine Methode mit der Signatur implementieren:Filtering operations can include logging, automatic retries, etc. Filters are objects that implement a method with the signature:

function handle (requestOptions, next)

Nachdem die Vorverarbeitung der Anforderungsoptionen abgeschlossen ist, muss die Methode next aufrufen und hierbei eine Rückruffunktion mit der folgenden Signatur übergeben:After doing its preprocessing on the request options, the method must call next, passing a callback with the following signature:

function (returnObject, finalCallback, next)

Nachdem das returnObject-Objekt (die Antwort auf die an den Server gesendete Anforderung) verarbeitet wurde, muss in dieser Rückruffunktion entweder next aufgerufen werden, wenn die Tabelle vorhanden ist, um weitere Filter zu verarbeiten, oder es muss einfach finalCallback aufgerufen werden, um den Dienstaufruf zu beenden.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.

Zwei Filter, die eine Wiederholungslogik implementieren, sind im Azure SDK für Node.js enthalten: ExponentialRetryPolicyFilter und LinearRetryPolicyFilter.Two filters that implement retry logic are included with the Azure SDK for Node.js, ExponentialRetryPolicyFilter and LinearRetryPolicyFilter. Mit folgendem Code wird ein TableService-Objekt, das ExponentialRetryPolicyFilter verwendet:The following creates a TableService object that uses the ExponentialRetryPolicyFilter:

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

Hinzufügen einer Entität zu einer TabelleAdd an entity to a table

Um eine Entität hinzuzufügen, erstellen Sie zunächst ein Objekt, das die Entitätseigenschaften definiert.To add an entity, first create an object that defines your entity properties. Alle Entitäten müssen PartitionKey und RowKey enthalten, die eindeutige Bezeichner für die Entität darstellen.All entities must contain a PartitionKey and RowKey, which are unique identifiers for the entity.

  • PartitionKey: bestimmt die Partition, in der die Entität gespeichert ist.PartitionKey - Determines the partition in which the entity is stored.
  • RowKey: identifiziert die Entität innerhalb der Partition eindeutig.RowKey - Uniquely identifies the entity within the partition.

PartitionKey und RowKey müssen Zeichenfolgenwerte sein.Both PartitionKey and RowKey must be string values. Weitere Informationen finden Sie unter Grundlegendes zum Tabellendienst-Datenmodell.For more information, see Understanding the Table Service Data Model.

Nachfolgend sehen Sie ein Beispiel für die Definition einer Entität.The following is an example of defining an entity. Beachten Sie, dass dueDate vom Typ Edm.DateTime definiert ist.Note that dueDate is defined as a type of Edm.DateTime. Die Angabe des Typs ist optional. Nicht angegebene Typen werden abgeleitet.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'}
};

Hinweis

Für jeden Datensatz gibt es ein Timestamp -Feld, das von Azure festgelegt wird, wenn eine Entität eingefügt oder aktualisiert wird.There is also a Timestamp field for each record, which is set by Azure when an entity is inserted or updated.

Sie können Entitäten auch mit dem entityGenerator erstellen.You can also use the entityGenerator to create entities. Im folgenden Beispiel wird dieselbe Task-Entität mit dem entityGeneratorerstellt.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))),
};

Um eine Entität der Tabelle hinzuzufügen, übergeben Sie das Entitätsobjekt der insertEntity -Methode.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
  }
});

Ist der Vorgang erfolgreich, enthält result das ETag des eingefügten Datensatzes, und response enthält Informationen zum Vorgang.If the operation is successful, result contains the ETag of the inserted record and response contains information about the operation.

Beispielantwort:Example response:

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

Hinweis

Standardmäßig gibt insertEntity die eingefügte Entität nicht als Teil der response-Informationen zurück.By default, insertEntity does not return the inserted entity as part of the response information. Wenn Sie weitere Vorgänge mit der Entität ausführen oder die Informationen zwischenspeichern möchten, können Sie sie als Teil von resultzurückgeben.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. Hierzu aktivieren Sie echoContent wie folgt:You can do this by enabling echoContent as follows:

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

Aktualisieren einer EntitätUpdate an entity

Es sind mehrere Methoden zum Aktualisieren einer vorhandenen Entität vorhanden:There are multiple methods available to update an existing entity:

  • replaceEntity: aktualisiert eine vorhandene Entität, indem sie ersetzt wird.replaceEntity - Updates an existing entity by replacing it.
  • mergeEntity: aktualisiert eine vorhandene Entität durch Zusammenführen neuer Eigenschaftswerte mit der vorhandenen Entität.mergeEntity - Updates an existing entity by merging new property values into the existing entity.
  • insertOrReplaceEntity: aktualisiert eine vorhandene Entität, indem sie ersetzt wird.insertOrReplaceEntity - Updates an existing entity by replacing it. Wenn keine Entität vorhanden ist, wird eine neue eingefügt.If no entity exists, a new one will be inserted.
  • insertOrMergeEntity: aktualisiert eine vorhandene Entität durch Zusammenführen neuer Eigenschaftswerte mit der vorhandenen Entität.insertOrMergeEntity - Updates an existing entity by merging new property values into the existing. Wenn keine Entität vorhanden ist, wird eine neue eingefügt.If no entity exists, a new one will be inserted.

Das folgende Beispiel zeigt, wie eine Entität mit replaceEntityaktualisiert wird:The following example demonstrates updating an entity using replaceEntity:

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

Hinweis

Standardmäßig wird beim Aktualisieren einer Entität nicht überprüft, ob die aktualisierten Daten zuvor von einem anderen Prozess geändert wurden.By default, updating an entity does not check to see if the data being updated has previously been modified by another process. Um gleichzeitige Aktualisierungen zu unterstützen, gehen Sie wie folgt vor:To support concurrent updates:

  1. Rufen Sie das Etag des aktualisierten Objekts ab.Get the ETag of the object being updated. Es wird im Rahmen der response für jeden entitätsbezogenen Vorgang zurückgegeben und kann durch response['.metadata'].etag abgerufen werden.This is returned as part of the response for any entity-related operation and can be retrieved through response['.metadata'].etag.

  2. Wenn Sie einen Aktualisierungsvorgang für eine Entität ausführen, sollten Sie der neuen Entität die zuvor abgerufenen ETag-Informationen hinzufügen.When performing an update operation on an entity, add the ETag information previously retrieved to the new entity. Beispiel:For example:

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

  3. Führen Sie den Aktualisierungsvorgang aus.Perform the update operation. Wurde die Entität seit dem Abruf des ETag-Werts beispielsweise durch eine andere Instanz Ihrer Anwendung geändert, wird ein error zurückgegeben. Der Wert besagt, dass die in der Anforderung angegebene Aktualisierungsbedingung nicht erfüllt ist.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.

Mit replaceEntity und mergeEntity schlägt die Aktualisierung fehl, wenn die Entität, die aktualisiert wird, nicht vorhanden ist. Wenn Sie eine Entität unabhängig davon, ob sie bereits vorhanden ist, speichern möchten, verwenden Sie insertOrReplaceEntity oder 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.

Bei erfolgreichen Aktualisierungsvorgängen enthält das result das ETag der aktualisierten Entität.The result for successful update operations contains the Etag of the updated entity.

Arbeiten mit Gruppen von EntitätenWork with groups of entities

Gelegentlich ist es sinnvoll, mehrere Vorgänge zusammen in einem Batch zu senden, um die atomische Verarbeitung durch den Server sicherzustellen.Sometimes it makes sense to submit multiple operations together in a batch to ensure atomic processing by the server. Dazu erstellen Sie mit der TableBatch-Klasse einen Batch und führen dann mit der executeBatch-Methode von TableService die Batchvorgänge aus.To accomplish that, use the TableBatch class to create a batch, and then use the executeBatch method of TableService to perform the batched operations.

Im folgenden Beispiel wird gezeigt, wie zwei Entitäten in einem Stapel übermittelt werden: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
  }
});

Bei erfolgreichen Batchvorgängen enthält result Informationen für jeden Vorgang im Batch.For successful batch operations, result contains information for each operation in the batch.

Arbeiten mit BatchvorgängenWork with batched operations

Vorgänge, die zu einem Batch hinzugefügt wurden, können Sie durch Anzeigen der Eigenschaft operations überprüfen.You can inspect operations added to a batch by viewing the operations property. Sie können auch die folgenden Methoden verwenden, um mit Vorgängen zu arbeiten.You can also use the following methods to work with operations:

  • clear: löscht alle Vorgänge aus einem Batch.clear - Clears all operations from a batch.
  • getOperations: ruft einen Vorgang aus dem Batch ab.getOperations - Gets an operation from the batch.
  • hasOperations: gibt „true“ zurück, wenn der Batch Vorgänge enthält.hasOperations - Returns true if the batch contains operations.
  • removeOperations: entfernt einen Vorgang.removeOperations - Removes an operation.
  • size: gibt die Anzahl von Vorgängen im Batch zurück.size - Returns the number of operations in the batch.

Abrufen einer Entität nach SchlüsselRetrieve an entity by key

Wenn Sie eine bestimmte Entität basierend auf PartitionKey und RowKey zurückgeben möchten, verwenden Sie die retrieveEntity-Methode.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
  }
});

Nach Abschluss des Vorgangs enthält result die Entität.After this operation is complete, result contains the entity.

Abfragen einer Gruppe von EntitätenQuery a set of entities

Um eine Tabelle abzufragen, erstellen Sie mithilfe des TableQuery-Objekts einen Abfrageausdruck mit folgenden Klauseln:To query a table, use the TableQuery object to build up a query expression using the following clauses:

  • select: die von der Abfrage zurückgegebenen Felder.select - The fields to be returned from the query.

  • where: die where-Klausel.where - The where clause.

    • and: eine and where-Bedingung.and - An and where condition.
    • or: eine or where-Bedingung.or - An or where condition.
  • top: die Anzahl der abzurufenden Elemente.top - The number of items to fetch.

Im folgenden Beispiel wird eine Abfrage erstellt, die die ersten fünf Elemente mit dem PartitionKey „hometasks“ zurückgibt.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');

Da select nicht verwendet wird, werden alle Felder zurückgegeben.Because select is not used, all fields are returned. Verwenden Sie queryEntities, um die Abfrage für eine Tabelle auszuführen.To perform the query against a table, use queryEntities. Im folgenden Beispiel werden mit der Abfrage Entitäten aus 'mytable' zurückgegeben.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
  }
});

Nach erfolgreicher Ausführung enthält result.entries ein Array von Entitäten, die die Abfrage erfüllen.If successful, result.entries contains an array of entities that match the query. Wenn nicht alle Entitäten von der Abfrage zurückgegeben werden konnten, ist result.continuationToken ungleich Null und kann als dritter Parameter von queryEntities verwendet werden, um weitere Ergebnisse abzurufen.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. Verwenden Sie in der ersten Abfrage null als dritten Parameter.For the initial query, use null for the third parameter.

Abfragen einer Teilmenge von EntitätseigenschaftenQuery a subset of entity properties

Mit einer Abfrage einer Tabelle können nur einige wenige Felder einer Entität aufgerufen werden.A query to a table can retrieve just a few fields from an entity. Somit wird die Bandbreite reduziert und die Abfrageleistung gesteigert, vor allem bei großen Entitäten.This reduces bandwidth and can improve query performance, especially for large entities. Verwenden Sie die select -Klausel, und übergeben Sie die Namen der zurückzugebenden Felder.Use the select clause and pass the names of the fields to return. Die folgende Abfrage gibt beispielsweise nur die Felder description und dueDate zurück.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');

Löschen einer EntitätDelete an entity

Sie können eine Entität unter Verwendung ihres Partitions- und Zeilenschlüssels löschen.You can delete an entity using its partition and row keys. In diesem Beispiel enthält das Objekt task1 die RowKey- und PartitionKey-Werte der zu löschenden Entität.In this example, the task1 object contains the RowKey and PartitionKey values of the entity to delete. Dann wird das Objekt der deleteEntity -Methode übergeben.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
  }
});

Hinweis

Es ist ratsam, beim Löschen von Elementen ETags zu verwenden, um sicherzustellen, dass das Element nicht von einem anderen Prozess geändert wurde.Consider using ETags when deleting items, to ensure that the item hasn't been modified by another process. Informationen zum Verwenden von ETags finden Sie unter Aktualisieren einer Entität .See Update an entity for information on using ETags.

Löschen einer TabelleDelete a table

Mit dem folgenden Code wird eine Tabelle aus einem Speicherkonto gelöscht.The following code deletes a table from a storage account.

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

Wenn Sie nicht wissen, ob die Tabelle vorhanden ist, verwenden Sie deleteTableIfExists.If you are uncertain whether the table exists, use deleteTableIfExists.

Verwenden von FortsetzungstokenUse continuation tokens

Wenn Sie in Tabellen umfangreiche Ergebnismengen abfragen, sollten Sie nach Fortsetzungstoken suchen.When you are querying tables for large amounts of results, look for continuation tokens. Möglicherweise sind umfangreiche Datenmengen für die Abfrage verfügbar, die Sie nicht erkennen können, wenn ein Fortsetzungstoken vorhanden ist.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.

Das beim Abfragen von Entitäten zurückgegebene results-Objekt legt eine continuationToken-Eigenschaft fest, wenn ein derartiges Token vorhanden ist.The results object returned during querying entities sets a continuationToken property when such a token is present. Diese können Sie dann beim Durchführen einer Abfrage verwenden, um die Partitions- und Tabellenentitäten zu durchlaufen.You can then use this when performing a query to continue to move across the partition and table entities.

Bei der Abfrage können Sie ein continuationToken-Parameter zwischen der query-Objektinstanz und der callback-Funktion bereitstellen: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;
        }

    });

Das continuationToken-Objekt enthält Eigenschaften wie z. B. nextPartitionKey, nextRowKey und targetLocation, die zum Durchlaufen der Ergebnisse verwendet werden können.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.

Sie können auch top zusammen mit continuationToken verwenden, um die Seitengröße festzulegen.You can also use top along with continuationToken to set the page size.

Arbeiten mit Shared Access SignaturesWork with shared access signatures

Shared Access Signatures (SAS) ermöglichen auf sichere Art und Weise differenzierten Zugriff auf Tabellen, ohne Speicherkontonamen oder -schlüssel anzugeben.Shared access signatures (SAS) are a secure way to provide granular access to tables without providing your Storage account name or keys. SAS werden häufig verwendet, um eingeschränkten Zugriff auf Ihre Daten zu bieten, beispielsweise um einer mobilen App die Abfrage von Datensätzen zu ermöglichen.SAS are often used to provide limited access to your data, such as allowing a mobile app to query records.

Eine vertrauenswürdige Anwendung, z. B. ein cloudbasierter Dienst, generiert mit der generateSharedAccessSignature-Methode des TableService-Objekts eine SAS und stellt sie für eine nicht vertrauenswürdige oder teilweise vertrauenswürdige Anwendung, z. B. eine mobile App, bereit.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. Die SAS wird mithilfe einer Richtlinie generiert, die das Anfangs- und das Enddatum der Gültigkeit der SAS sowie die Zugriffsstufe definiert, die dem Inhaber der SAS gewährt wird.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.

Im folgenden Beispiel wird eine neue Richtlinie für den freigegebenen Zugriff generiert, die dem SAS-Inhaber erlaubt, die Tabelle abzufragen ('r'), und 100 Minuten nach ihrer Erstellung abläuft.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;

Beachten Sie, dass Sie die Hostinformationen ebenfalls angeben müssen. Diese sind erforderlich, wenn der SAS-Inhaber versucht, auf die Tabelle zuzugreifen.Note that you must also provide the host information, as it is required when the SAS holder attempts to access the table.

Die Clientanwendung verwendet die SAS dann zusammen mit TableServiceWithSAS , um Vorgänge für die Tabelle auszuführen.The client application then uses the SAS with TableServiceWithSAS to perform operations against the table. Im folgenden Beispiel wird eine Verbindung mit der Tabelle hergestellt und eine Abfrage ausgeführt.The following example connects to the table and performs a query. Im Artikel Gewähren von eingeschränktem Zugriff auf Azure Storage-Ressourcen mithilfe von SAS (Shared Access Signature) können Sie sich das Format von tableSAS ansehen.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
  }
});

Da die SAS nur mit Abfragezugriff generiert wurde, wird ein Fehler zurückgegeben, wenn Sie versuchen, Entitäten einzufügen, zu aktualisieren oder zu löschen.Because the SAS was generated with only query access, an error is returned if you attempt to insert, update, or delete entities.

ZugriffssteuerungslistenAccess Control Lists

Sie können auch eine Zugriffssteuerungsliste (Access Control List, ACL) verwenden, um die Zugriffsrichtlinie für eine SAS festzulegen.You can also use an Access Control List (ACL) to set the access policy for a SAS. Dies ist nützlich, wenn Sie mehreren Clients Zugriff auf die Tabelle gewähren, aber für jeden Client andere Zugriffsrichtlinien angeben möchten.This is useful if you want to allow multiple clients to access the table, but provide different access policies for each client.

Eine ACL wird in einem Array von Zugriffsrichtlinien implementiert, wobei jeder Richtlinie eine ID zugeordnet wird.An ACL is implemented using an array of access policies, with an ID associated with each policy. Im folgenden Beispiel werden zwei Richtlinien definiert, eine für "user1" und eine für "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
  }
};

Im folgenden Beispiel wird zunächst die aktuelle ACL für die Tabelle hometasks abgerufen. Anschließend werden die neuen Richtlinien mit setTableAcl hinzugefügt.The following example gets the current ACL for the hometasks table, and then adds the new policies using setTableAcl. Dieser Ansatz ermöglicht Folgendes: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
      }
    });
  }
});

Nachdem die ACL festgelegt wurde, können Sie basierend auf der ID für eine Richtlinie eine SAS erstellen.After the ACL has been set, you can then create a SAS based on the ID for a policy. Im folgenden Beispiel wird eine neue SAS für 'user2' erstellt:The following example creates a new SAS for 'user2':

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

Nächste SchritteNext steps

Weitere Informationen finden Sie in den folgenden Ressourcen.For more information, see the following resources.