Jak používat službu Azure Table Storage nebo rozhraní Table API služby Azure Cosmos DB z Node.jsHow to use Azure Table storage or the Azure Cosmos DB Table API from Node.js

Tip

Obsah v tomto článku se vztahuje na službu Azure Table Storage a rozhraní Azure Cosmos DB Table API.The content in this article applies to Azure Table storage and the Azure Cosmos DB Table API. Rozhraní Azure Cosmos DB Table API je nabídka služby Table Storage úrovně Premium, která nabízí tabulky optimalizované pro zvýšení propustnosti, globální distribuci a automatické sekundární indexy.The Azure Cosmos DB Table API is a premium offering for table storage that offers throughput-optimized tables, global distribution, and automatic secondary indexes.

PřehledOverview

Tento článek popisuje, jak v aplikaci Node.js provádět běžné scénáře pomocí služby Azure Table Storage nebo Azure Cosmos DB.This article shows how to perform common scenarios using Azure Storage Table service or Azure Cosmos DB in a Node.js application.

Vytvoření účtu služby AzureCreate an Azure service account

S tabulkami můžete pracovat prostřednictvím služby Azure Table Storage nebo Azure Cosmos DB.You can work with tables using Azure Table storage or Azure Cosmos DB. Další informace o rozdílech mezi službami najdete v tématu nabídky tabulek.To learn more about the differences between the services, see Table offerings. U služby, kterou budete používat, si budete muset vytvořit účet.You'll need to create an account for the service you're going to use.

Vytvoření účtu úložiště AzureCreate an Azure storage account

Nejjednodušší způsob, jak vytvořit účet úložiště Azure, je použít Azure Portal.The easiest way to create an Azure storage account is by using the Azure portal. Další informace najdete v tématu Vytvoření účtu úložiště.To learn more, see Create a storage account.

Účet úložiště Azure můžete vytvořit také pomocí Azure PowerShellu nebo Azure CLI.You can also create an Azure storage account by using Azure PowerShell or Azure CLI.

Pokud teď nechcete vytvářet účet úložiště, můžete také pomocí emulátoru úložiště Azure spustit a otestovat kód v místním prostředí.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. Další informace najdete v článku Použití emulátoru úložiště Azure pro vývoj a testování.For more information, see Use the Azure storage emulator for development and testing.

Vytvoření účtu rozhraní Table API služby Azure Cosmos DBCreate an Azure Cosmos DB Table API account

Pokyny k vytvoření účtu Azure Cosmos DB rozhraní API pro tabulky najdete v tématu vytvoření databázového účtu.For instructions on creating an Azure Cosmos DB Table API account, see Create a database account.

Konfigurace aplikace pro přístup ke službě Azure Storage nebo rozhraní Table API služby Azure Cosmos DBConfigure your application to access Azure Storage or the Azure Cosmos DB Table API

Pokud chcete používat službu Azure Storage nebo Azure Cosmos DB, potřebujete sadu SDK služby Azure Storage pro Node.js, která obsahuje sadu knihoven usnadňujících práci a komunikujících se službami REST služby Storage.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.

Instalace balíčku pomocí Node Package Manageru (NPM)Use Node Package Manager (NPM) to install the package

  1. Použijte rozhraní příkazového řádku, jako je PowerShell (Windows), Terminál (Mac) nebo Bash (Unix), a přejděte do složky, ve které jste vytvořili svou aplikaci.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. Do příkazového okna zadejte npm install azure-storage.Type npm install azure-storage in the command window. Výstup příkazu je podobný následujícímu příkladu.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. Můžete ručně spustit příkaz ls a ověřit, že se vytvořila složka node_modules.You can manually run the ls command to verify that a node_modules folder was created. Uvnitř této složky najdete balíček azure-storage obsahující knihovny, které potřebujete pro přístup k úložišti.Inside that folder you will find the azure-storage package, which contains the libraries you need to access storage.

Import balíčkuImport the package

Na začátek souboru server.js ve vaší aplikaci přidejte následující kód:Add the following code to the top of the server.js file in your application:

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

Přidání připojení ke službě Azure StorageAdd an Azure Storage connection

Modul Azure načte informace potřebné pro připojení k účtu služby Azure Storage z proměnných prostředí AZURE_STORAGE_ACCOUNT a AZURE_STORAGE_ACCESS_KEY nebo AZURE_STORAGE_CONNECTION_STRING.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. Pokud tyto proměnné prostředí nejsou nastavené, musíte zadat informace o účtu při volání objektu TableService.If these environment variables are not set, you must specify the account information when calling TableService. Například následující kód vytvoří objekt TableService:For example, the following code creates a TableService object:

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

Přidání připojení ke službě Azure Cosmos DBAdd an Azure Cosmos DB connection

Pokud chcete přidat připojení ke službě Azure Cosmos DB, vytvořte objekt TableService a zadejte název, primární klíč a koncový bod vašeho účtu.To add an Azure Cosmos DB connection, create a TableService object and specify your account name, primary key, and endpoint. Tyto hodnoty můžete zkopírovat z části Nastavení > Připojovací řetězec na webu Azure Portal pro váš účet služby Cosmos DB.You can copy these values from Settings > Connection String in the Azure portal for your Cosmos DB account. Příklad:For example:

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

Vytvoření tabulkyCreate a table

Následující kód vytvoří objekt TableService a použije ho k vytvoření nové tabulky.The following code creates a TableService object and uses it to create a new table.

var tableSvc = azure.createTableService();

Volání createTableIfNotExists vytvoří novou tabulku se zadaným názvem, pokud ještě neexistuje.The call to createTableIfNotExists creates a new table with the specified name if it does not already exist. Následující příklad vytvoří novou tabulku mytable, pokud ještě neexistuje: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
  }
});

result.created má hodnotu true, pokud se vytvoří nová tabulka, a hodnotu false, pokud tabulka již existuje.The result.created is true if a new table is created, and false if the table already exists. response obsahuje informace o požadavku.The response contains information about the request.

FiltryFilters

Na operace provedené pomocí objektu TableService můžete použít volitelné filtrování.You can apply optional filtering to operations performed using TableService. Operace filtrování můžou zahrnovat protokolování, automatické opakování, atd. Filtry jsou objekty, které implementují metodu s podpisem:Filtering operations can include logging, automatic retries, etc. Filters are objects that implement a method with the signature:

function handle (requestOptions, next)

Po dokončení předzpracování možností požadavku musí metoda zavolat funkci next a předat zpětné volání s následujícím podpisem:After doing its preprocessing on the request options, the method must call next, passing a callback with the following signature:

function (returnObject, finalCallback, next)

V tomto zpětném volání a po zpracování objektu returnObject (odpověď z požadavku na server) musí zpětné volání buď zavolat funkci next, pokud existuje, a pokračovat ve zpracování dalších filtrů, nebo jednoduše zavolat zpětné volání finalCallback a ukončit volání služby.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.

Sada Azure SDK pro Node.js obsahuje dva filtry, které implementují logiku opakování: ExponentialRetryPolicyFilter a LinearRetryPolicyFilter.Two filters that implement retry logic are included with the Azure SDK for Node.js, ExponentialRetryPolicyFilter and LinearRetryPolicyFilter. Následující kód vytvoří objekt TableService, který využívá filtr ExponentialRetryPolicyFilter:The following creates a TableService object that uses the ExponentialRetryPolicyFilter:

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

Přidání entity do tabulkyAdd an entity to a table

Pokud chcete přidat entitu, nejprve vytvořte objekt definující vlastnosti entity.To add an entity, first create an object that defines your entity properties. Všechny entity musí obsahovat PartitionKey a RowKey, což jsou jedinečné identifikátory entity.All entities must contain a PartitionKey and RowKey, which are unique identifiers for the entity.

  • PartitionKey – Určuje oddíl, ve kterém je entita uložená.PartitionKey - Determines the partition in which the entity is stored.
  • RowKey – Jednoznačně identifikuje entitu v rámci oddílu.RowKey - Uniquely identifies the entity within the partition.

PartitionKey i RowKey musí být řetězcové hodnoty.Both PartitionKey and RowKey must be string values. Další informace najdete v tématu Vysvětlení datového modelu služby Table Storage.For more information, see Understanding the Table Service Data Model.

Následuje příklad definice entity.The following is an example of defining an entity. Všimněte si, že dueDate je definovaný jako typ Edm.DateTime.Note that dueDate is defined as a type of Edm.DateTime. Zadání typu je volitelné. Pokud typ není zadaný, odvodí se.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'}
};

Poznámka

Každý záznam obsahuje také pole Timestamp, které nastaví Azure při vložení nebo aktualizaci entity.There is also a Timestamp field for each record, which is set by Azure when an entity is inserted or updated.

K vytváření entit můžete využít také entityGenerator.You can also use the entityGenerator to create entities. Následující příklad vytvoří stejnou entitu úlohy pomocí generátoru 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))),
};

Pokud chcete do tabulky přidat entitu, předejte objekt entity 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
  }
});

Pokud bude operace úspěšná, result bude obsahovat značku entity vloženého záznamu a response bude obsahovat informace o operaci.If the operation is successful, result contains the ETag of the inserted record and response contains information about the operation.

Příklad odpovědi:Example response:

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

Poznámka

Ve výchozím nastavení insertEntity jako součást response nevrací informace o vložené entitě.By default, insertEntity does not return the inserted entity as part of the response information. Pokud s touto entitou plánujete provádět další operace nebo chcete informace uložit do mezipaměti, může být užitečné vrátit informace jako součást 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. Můžete to provést povolením možnosti echoContent následujícím způsobem:You can do this by enabling echoContent as follows:

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

Aktualizace entityUpdate an entity

Existující entitu můžete aktualizovat několika metodami:There are multiple methods available to update an existing entity:

  • replaceEntity – Aktualizuje existující entitu tím, že ji nahradí.replaceEntity - Updates an existing entity by replacing it.
  • mergeEntity – Aktualizuje existující entitu tím, že s ní sloučí nové hodnoty vlastností.mergeEntity - Updates an existing entity by merging new property values into the existing entity.
  • insertOrReplaceEntity – Aktualizuje existující entitu tím, že ji nahradí.insertOrReplaceEntity - Updates an existing entity by replacing it. Pokud žádná entita neexistuje, vloží se nová entita.If no entity exists, a new one will be inserted.
  • insertOrMergeEntity – Aktualizuje existující entitu tím, že s ní sloučí nové hodnoty vlastností.insertOrMergeEntity - Updates an existing entity by merging new property values into the existing. Pokud žádná entita neexistuje, vloží se nová entita.If no entity exists, a new one will be inserted.

Následující příklad ukazuje aktualizaci entity pomocí metody replaceEntity:The following example demonstrates updating an entity using replaceEntity:

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

Poznámka

Ve výchozím nastavení se při aktualizaci entity nekontroluje, jestli se aktualizovaná data dříve neupravila jiným procesem.By default, updating an entity does not check to see if the data being updated has previously been modified by another process. Zajištění podpory souběžných aktualizací:To support concurrent updates:

  1. Získejte značku entity aktualizovaného objektu.Get the ETag of the object being updated. Ta se vrací jako součást response pro všechny operace související s entitou a je možné ji načíst prostřednictvím příkazu 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. Při provádění operace aktualizace entity přidejte do nové entity dříve načtené informace o značce entity.When performing an update operation on an entity, add the ETag information previously retrieved to the new entity. Příklad:For example:

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

  3. Proveďte operaci aktualizace.Perform the update operation. Pokud se od načtení hodnoty značky entity daná entita upravila, například jinou instancí aplikace, vrátí se error oznamující, že nebyla splněná podmínka aktualizace zadaná v požadavku.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.

V případě metod replaceEntity a mergeEntity platí, že pokud aktualizovaná entita neexistuje, operace aktualizace selže. Pokud chcete entitu uložit bez ohledu na to, jestli již existuje, použijte metodu insertOrReplaceEntity nebo 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.

result pro úspěšné operace aktualizace obsahuje značku entity aktualizované entity.The result for successful update operations contains the Etag of the updated entity.

Práce se skupinami entitWork with groups of entities

Někdy má smysl odeslat více operací společně v dávce, aby se zajistilo jejich atomické zpracování serverem.Sometimes it makes sense to submit multiple operations together in a batch to ensure atomic processing by the server. Provedete to tak, že pomocí třídy TableBatch vytvoříte dávku a pak pomocí metody executeBatch objektu TableService provedete dávkové operace.To accomplish that, use the TableBatch class to create a batch, and then use the executeBatch method of TableService to perform the batched operations.

Následující příklad ukazuje odeslání dvou entit v dávce: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
  }
});

V případě úspěšných dávkových operací obsahuje result informace o jednotlivých operacích v dávce.For successful batch operations, result contains information for each operation in the batch.

Práce s dávkovými operacemiWork with batched operations

Operace přidané do dávky můžete prozkoumat zobrazením vlastnosti operations.You can inspect operations added to a batch by viewing the operations property. K práci s operacemi můžete využít také následující metody:You can also use the following methods to work with operations:

  • clear – Vymaže z dávky všechny operace.clear - Clears all operations from a batch.
  • getOperations – Získá z dávky operaci.getOperations - Gets an operation from the batch.
  • hasOperations – Vrátí hodnotu true, pokud dávka obsahuje operace.hasOperations - Returns true if the batch contains operations.
  • removeOperations – Odebere operaci.removeOperations - Removes an operation.
  • size – Vrátí počet operací v dávce.size - Returns the number of operations in the batch.

Načtení entity podle klíčeRetrieve an entity by key

Pokud chcete vrátit konkrétní entitu na základě hodnot PartitionKey a RowKey, použijte metodu 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 dokončení operace bude result obsahovat příslušnou entitu.After this operation is complete, result contains the entity.

Dotaz na sadu entitQuery a set of entities

Pokud chcete dotazovat tabulku, pomocí objektu TableQuery sestavte výraz dotazu s použitím následujících klauzulí:To query a table, use the TableQuery object to build up a query expression using the following clauses:

  • select – Pole, která má dotaz vrátit.select - The fields to be returned from the query.

  • where – Klauzule where.where - The where clause.

    • and – Podmínka and where.and - An and where condition.
    • or – Podmínka or where.or - An or where condition.
  • top – Počet položek, které se mají načíst.top - The number of items to fetch.

Následující příklad sestaví dotaz, který vrátí prvních pět položek, které jako PartitionKey mají hodnotu 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');

Vzhledem k tomu, že se nepoužila klauzule select, vrátí se všechna pole.Because select is not used, all fields are returned. Pokud chcete provést dotaz na tabulku, použijte queryEntities.To perform the query against a table, use queryEntities. Následující příklad pomocí tohoto dotazu vrátí entity z tabulky 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
  }
});

V případě úspěchu bude result.entries obsahovat pole entit, které odpovídají dotazu.If successful, result.entries contains an array of entities that match the query. Pokud dotaz nedokáže vrátit všechny entity, token result.continuationToken bude mít jinou hodnotu než null a můžete ho použít jako třetí parametr metody queryEntities pro načtení dalších výsledků.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. V počátečním dotazu jako třetí parametr použijte hodnotu null.For the initial query, use null for the third parameter.

Dotaz na podmnožinu vlastností entityQuery a subset of entity properties

Dotaz na tabulku dokáže z entity načíst pouze několik polí.A query to a table can retrieve just a few fields from an entity. Díky tomu se snižuje šířka pásma a může se zlepšit výkon dotazů, zejména u velkých entit.This reduces bandwidth and can improve query performance, especially for large entities. Použijte klauzuli select a předejte názvy polí, které se mají vrátit.Use the select clause and pass the names of the fields to return. Například následující dotaz vrátí pouze pole description a 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');

Odstranění entityDelete an entity

Entitu můžete odstranit pomocí jejího klíče oddílu a řádku.You can delete an entity using its partition and row keys. V tomto příkladu objekt task1 obsahuje hodnoty RowKey a PartitionKey entity, která se má odstranit.In this example, the task1 object contains the RowKey and PartitionKey values of the entity to delete. Objekt se pak předá 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
  }
});

Poznámka

Při odstraňování položek zvažte použití značek entit, abyste zajistili, že položku neupravil jiný proces.Consider using ETags when deleting items, to ensure that the item hasn't been modified by another process. Informace o použití značek entit najdete v části Aktualizace entity.See Update an entity for information on using ETags.

Odstranění tabulkyDelete a table

Následující kód odstraní tabulku z účtu úložiště.The following code deletes a table from a storage account.

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

Pokud si nejste jisti, jestli tabulka existuje, použijte deleteTableIfExists.If you are uncertain whether the table exists, use deleteTableIfExists.

Použití tokenů pro pokračováníUse continuation tokens

Pokud z tabulek dotazujete velké množství výsledků, hledejte tokeny pro pokračování.When you are querying tables for large amounts of results, look for continuation tokens. Pro váš dotaz může být k dispozici velké množství dat, kterých si nemusíte všimnout, pokud v rámci sestavování nezajistíte rozpoznání, jestli je přítomný token pro pokračování.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.

Pokud je takový token přítomný, v objektu results vraceném během dotazování entit se nastaví vlastnost continuationToken.The results object returned during querying entities sets a continuationToken property when such a token is present. Tuto vlastnost pak můžete při provádění dotazu použít k pohybu mezi oddíly a entitami tabulky.You can then use this when performing a query to continue to move across the partition and table entities.

Při dotazování můžete zadat parametr continuationToken mezi instanci objektu dotazu a funkci zpětného volání: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;
        }

    });

Při zkoumání objektu continuationToken si můžete všimnout vlastností, jako jsou nextPartitionKey, nextRowKey a targetLocation, které je možné použít k iteraci výsledky.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.

K nastavení velikosti stránky můžete použít také top společně s continuationToken.You can also use top along with continuationToken to set the page size.

Práce se sdílenými přístupovými podpisyWork with shared access signatures

Sdílené přístupové podpisy (SAS) představují bezpečný způsob zajištění podrobného přístupu k tabulkám bez nutnosti zadávat název nebo klíče vašeho účtu služby Storage.Shared access signatures (SAS) are a secure way to provide granular access to tables without providing your Storage account name or keys. SAS se často používá k zajištění omezeného přístupu k datům, jako je například povolení dotazování záznamů pro mobilní aplikaci.SAS are often used to provide limited access to your data, such as allowing a mobile app to query records.

Důvěryhodná aplikace, jako je například cloudová služba, generuje SAS pomocí metody generateSharedAccessSignature objektu TableService a poskytuje ho nedůvěryhodné nebo částečně důvěryhodné aplikaci, jako je například mobilní aplikace.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. SAS se generuje pomocí zásady, která popisuje počáteční a koncové datum platnosti SAS a také úroveň přístupu udělenou držiteli SAS.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.

Následující příklad vygeneruje novou zásadu sdíleného přístupu, která umožní držiteli SAS dotazovat (r) tabulku a jejíž platnost vyprší 100 minut od okamžiku jejího vytvoření.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;

Všimněte si, že musíte zadat také informace o hostiteli, které se vyžadují při pokusu držitele SAS o přístup k tabulce.Note that you must also provide the host information, as it is required when the SAS holder attempts to access the table.

Klientská aplikace pak provádí operace s tabulkou pomocí SAS a metody TableServiceWithSAS.The client application then uses the SAS with TableServiceWithSAS to perform operations against the table. Následující příklad se připojí k tabulce a provede dotaz.The following example connects to the table and performs a query. Informace o formátu tableSAS najdete v článku udělení omezeného přístupu k prostředkům Azure Storage pomocí článku sdílené přístupové podpisy (SAS) .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
  }
});

Vzhledem k tomu, že se SAS vygeneroval pouze s přístupem k dotazům, při pokusu o vložení, aktualizaci nebo odstranění entit se vrátí chyba.Because the SAS was generated with only query access, an error is returned if you attempt to insert, update, or delete entities.

Seznamy řízení přístupuAccess Control Lists

K nastavení zásad přístupu pro SAS můžete použít také seznam řízení přístupu (ACL).You can also use an Access Control List (ACL) to set the access policy for a SAS. To je užitečné, pokud chcete umožnit přístup k tabulce několika klientům, ale pro každého klienta chcete zajistit jiné zásady přístupu.This is useful if you want to allow multiple clients to access the table, but provide different access policies for each client.

Seznam ACL se implementuje pomocí pole zásad přístupu, z nichž každá zásada má přidružené ID.An ACL is implemented using an array of access policies, with an ID associated with each policy. Následující příklad definuje dvě zásady, jednu pro uživatele user1 a druhou pro uživatele 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
  }
};

Následující příklad získá aktuální seznam ACL pro tabulku hometasks a pak pomocí metody setTableAcl přidá nové zásady.The following example gets the current ACL for the hometasks table, and then adds the new policies using setTableAcl. Tento přístup umožňuje: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 nastavení seznamu ACL pak můžete pro zásadu vytvořit SAS založený na ID.After the ACL has been set, you can then create a SAS based on the ID for a policy. Následující příklad vytvoří nový SAS pro uživatele user2:The following example creates a new SAS for 'user2':

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

Další krokyNext steps

Další informace najdete v následujících materiálech.For more information, see the following resources.