Node.js uygulamasından Azure Tablo depolama veya Azure Cosmos DB Tablo API’sini kullanmaHow to use Azure Table storage or the Azure Cosmos DB Table API from Node.js

İpucu

Bu makaledeki içerik, Azure Tablo depolama ve Azure Cosmos DB Tablo API’si için geçerlidir.The content in this article applies to Azure Table storage and the Azure Cosmos DB Table API. Azure Cosmos DB Tablo API’si, aktarım hızı iyileştirilmiş tablolar, global dağıtım ve otomatik ikincil dizinler sunan premium bir tekliftir.The Azure Cosmos DB Table API is a premium offering for table storage that offers throughput-optimized tables, global distribution, and automatic secondary indexes.

Genel BakışOverview

Bu makalede, bir Node.js uygulamasında Azure Depolama Tablo hizmetini veya Azure Cosmos DB’yi kullanarak genel senaryoların nasıl gerçekleştirileceği gösterilmektedir.This article shows how to perform common scenarios using Azure Storage Table service or Azure Cosmos DB in a Node.js application.

Azure hizmet hesabı oluşturmaCreate an Azure service account

Azure Tablosu depolaması veya Azure Cosmos DB kullanarak tablolarla çalışabilirsiniz.You can work with tables using Azure Table storage or Azure Cosmos DB. Hizmetler arasındaki farklar hakkında daha fazla bilgi edinmek için Tablo teklifleri'ni okuyun.You can learn more about the differences between the services by reading Table offerings. Kullanacağınız hizmet için bir hesap oluşturmanız gerekir.You'll need to create an account for the service you're going to use.

Azure Storage hesabı oluşturmaCreate an Azure storage account

İlk Azure depolama hesabınızı oluşturmanın en kolay yolu Azure Portalı’nı kullanmaktır.The easiest way to create your first Azure storage account is by using the Azure portal. Daha fazla bilgi için bkz. Depolama hesabı oluşturma.To learn more, see Create a storage account.

Azure PowerShell veya Azure CLI kullanarak da bir Azure depolama hesabı oluşturabilirsiniz.You can also create an Azure storage account by using Azure PowerShell or Azure CLI.

Şu anda bir depolama hesabı oluşturmayı tercih ediyorsanız, yerel bir ortamda kodunuzu çalıştırıp sınamak için Azure Storage öykünücüsü de kullanabilirsiniz.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. Daha fazla bilgi için bkz. Geliştirme ve Sınama için Azure Storage Öykünücüsünü Kullanma.For more information, see Use the Azure Storage Emulator for Development and Testing.

Azure Cosmos DB Tablo API’si hesabı oluşturmaCreate an Azure Cosmos DB Table API account

Azure Cosmos DB Tablo API'si hesabı kullanma yönergeleri için bkz. Tablo API'si hesabı oluşturma.For instructions on creating an Azure Cosmos DB Table API account, see Create a Table API account.

Azure Depolama veya Azure Cosmos DB Tablo API’sine erişmek için uygulamanızı yapılandırmaConfigure your application to access Azure Storage or the Azure Cosmos DB Table API

Azure Depolama veya Azure Cosmos DB’yi kullanmak için, Depolama REST hizmetleriyle iletişim kuran bir dizi kitaplık içeren Node.js için Azure Depolama SDK’sı gerekir.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.

Paketi yüklemek için Düğüm Paket Yöneticisi’ni (NPM) kullanmaUse Node Package Manager (NPM) to install the package

  1. PowerShell (Windows), Terminal (Mac) veya Bash (Unix) gibi bir komut satırı arabirimi kullanın ve uygulamanızı oluşturduğunuz klasöre gidin.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. Komut penceresine npm install azure-storage yazın.Type npm install azure-storage in the command window. Komutun çıktısı aşağıdaki örneğe benzer.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. Bir node_modules klasörünün oluşturulduğunu doğrulamak için ls komutunu kendiniz çalıştırabilirsiniz.You can manually run the ls command to verify that a node_modules folder was created. Bu klasörün içinde, depolama alanına erişmek için ihtiyaç duyduğunuz kitaplıkları içeren azure-storage paketini bulacaksınız.Inside that folder you will find the azure-storage package, which contains the libraries you need to access storage.

Paketi içeri aktarmaImport the package

Uygulamanızda server.js dosyasının üst kısmına aşağıdaki kodu ekleyin:Add the following code to the top of the server.js file in your application:

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

Azure Depolama bağlantısı eklemeAdd an Azure Storage connection

Azure modülü, Azure Depolama hesabınıza bağlanmak için gerekli bilgiler için AZURE_STORAGE_ACCOUNT ve AZURE_STORAGE_ACCESS_KEY veya AZURE_STORAGE_CONNECTION_STRING ortam değişkenlerini okur.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. Bu ortam değişkenleri ayarlanmamışsa, TableService çağrılırken hesap bilgilerini belirtmeniz gerekir.If these environment variables are not set, you must specify the account information when calling TableService. Örneğin, aşağıdaki kod bir TableService nesnesi oluşturur:For example, the following code creates a TableService object:

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

Azure Cosmos DB bağlantısını eklemeAdd an Azure Cosmos DB connection

Azure Cosmos DB bağlantısı eklemek için bir TableService nesnesi oluşturun ve hesap adınızı, birincil anahtarınızı ve uç noktanızı belirtin.To add an Azure Cosmos DB connection, create a TableService object and specify your account name, primary key, and endpoint. Bu değerleri, Cosmos DB hesabınız için Azure portalındaki Ayarlar > Bağlantı Dizesi bölümünden kopyalayabilirsiniz.You can copy these values from Settings > Connection String in the Azure portal for your Cosmos DB account. Örneğin:For example:

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

Bir tablo oluşturmaCreate a table

Aşağıdaki kod bir TableService nesnesi oluşturur ve yeni bir tablo oluşturmak için bu nesneyi kullanır.The following code creates a TableService object and uses it to create a new table.

var tableSvc = azure.createTableService();

createTableIfNotExists çağrısı, henüz yoksa, belirtilen adla yeni bir tablo oluşturur.The call to createTableIfNotExists creates a new table with the specified name if it does not already exist. Aşağıdaki örnek, henüz yoksa, 'mytable' adlı yeni bir tablo oluşturur: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, yeni bir tablo oluşturulursa true, tablo zaten mevcutsa false olur.The result.created is true if a new table is created, and false if the table already exists. response, istekle ilgili bilgileri içerir.The response contains information about the request.

FiltrelerFilters

TableService kullanarak gerçekleştirilen işlemlere isteğe bağlı filtreleme uygulayabilirsiniz.You can apply optional filtering to operations performed using TableService. Filtreleme işlemleri, günlük kaydı, otomatik yeniden deneme vb. içerebilir. Filtreler, imza ile bir yöntem uygulayan nesnelerdir:Filtering operations can include logging, automatic retries, etc. Filters are objects that implement a method with the signature:

function handle (requestOptions, next)

İstek seçeneklerinde önişlemi yapıldıktan sonra yöntem, aşağıdaki imza ile bir geri çağrı geçirerek next çağrısı yapmalıdır:After doing its preprocessing on the request options, the method must call next, passing a callback with the following signature:

function (returnObject, finalCallback, next)

Bu geri çağrıda ve returnObject (istekten sunucuya verilen yanıt) işlendikten sonra geri çağrı, diğer filtreleri işlemeye devam etmek için varsa next çağrısı yapmalı veya hizmet çağrısını sonlandırmak için finalCallback çağrısı yapmalıdır.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.

Yeniden deneme mantığı uygulayan iki filtre (ExponentialRetryPolicyFilter ve LinearRetryPolicyFilter), Node.js için Azure SDK’sına dahil edilir.Two filters that implement retry logic are included with the Azure SDK for Node.js, ExponentialRetryPolicyFilter and LinearRetryPolicyFilter. Aşağıda, ExponentialRetryPolicyFilter kullanan bir TableService nesnesi oluşturulur:The following creates a TableService object that uses the ExponentialRetryPolicyFilter:

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

Tabloya bir varlık eklemeAdd an entity to a table

Bir varlık eklemek için ilk olarak varlık özelliklerinizi tanımlayan bir nesne oluşturun.To add an entity, first create an object that defines your entity properties. Tüm varlıklar, varlık için benzersiz tanımlayıcılar olan PartitionKey ve RowKey içermelidir.All entities must contain a PartitionKey and RowKey, which are unique identifiers for the entity.

  • PartitionKey: Varlığın depolandığı bölümü belirler.PartitionKey - Determines the partition in which the entity is stored.
  • RowKey: Bölüm içindeki varlığı benzersiz şekilde tanımlar.RowKey - Uniquely identifies the entity within the partition.

Hem PartitionKey hem de RowKey dize değerleri olmalıdır.Both PartitionKey and RowKey must be string values. Daha fazla bilgi için bkz. Tablo Hizmeti Veri Modelini anlama.For more information, see Understanding the Table Service Data Model.

Aşağıda, bir varlığın tanımlanmasına örnek verilmiştir.The following is an example of defining an entity. dueDate, bir Edm.DateTime türü olarak tanımlanır.Note that dueDate is defined as a type of Edm.DateTime. Tür belirtme isteğe bağlıdır ve türler belirtilmezse çıkarsanır.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'}
};

Not

Ayrıca her kayıt için bir Timestamp alanı vardır ve bu alan, bir varlık eklendiğinde veya güncelleştirildiğinde Azure tarafından ayarlanır.There is also a Timestamp field for each record, which is set by Azure when an entity is inserted or updated.

Varlıklar oluşturmak için entityGenerator da kullanabilirsiniz.You can also use the entityGenerator to create entities. Aşağıdaki örnek, entityGenerator kullanılmasıyla aynı görevi oluşturur.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))),
};

Tablonuza bir varlık eklemek için, varlık nesnesini insertEntity yöntemine geçirin.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
  }
});

İşlem başarılı olursa result, eklenen kaydın ETag öğesini içerir ve response, işlemle ilgili bilgileri içerir.If the operation is successful, result contains the ETag of the inserted record and response contains information about the operation.

Örnek yanıt:Example response:

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

Not

Varsayılan olarak insertEntity, response bilgilerinin parçası olarak eklenen varlığı döndürmez.By default, insertEntity does not return the inserted entity as part of the response information. Bu varlık üzerinde başka işlemler gerçekleştirmeyi planlıyor veya bilgileri önbelleğe almak istiyorsanız, result değerinin parçası olarak bunun döndürülmesini sağlamak yararlı olabilir.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. Aşağıdaki gibi echoContent seçeneğini etkinleştirerek bunu yapabilirsiniz:You can do this by enabling echoContent as follows:

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

Varlığı güncelleştirmeUpdate an entity

Mevcut bir varlığı güncelleştirmenin birçok yolu vardır:There are multiple methods available to update an existing entity:

  • replaceEntity: Mevcut varlığı başkasıyla değiştirerek güncelleştirir.replaceEntity - Updates an existing entity by replacing it.
  • mergeEntity: Yeni özellik değerlerini mevcut varlıkla birleştirerek mevcut bir varlığı güncelleştirir.mergeEntity - Updates an existing entity by merging new property values into the existing entity.
  • insertOrReplaceEntity: Mevcut bir varlığı başkasıyla değiştirerek güncelleştirir.insertOrReplaceEntity - Updates an existing entity by replacing it. Bir varlık yoksa, yenisi eklenir.If no entity exists, a new one will be inserted.
  • insertOrMergeEntity: Yeni özellik değerlerini mevcut varlıkla birleştirerek mevcut bir varlığı güncelleştirir.insertOrMergeEntity - Updates an existing entity by merging new property values into the existing. Bir varlık yoksa, yenisi eklenir.If no entity exists, a new one will be inserted.

Aşağıdaki örnekte replaceEntity kullanılarak bir varlığın güncelleştirilmesi gösterilmektedir:The following example demonstrates updating an entity using replaceEntity:

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

Not

Varsayılan olarak, bir varlık güncelleştirildiğinde, güncelleştirilmekte olan verilerin önceden başka bir işlem tarafından değiştirilip değiştirilmediği denetlenmez.By default, updating an entity does not check to see if the data being updated has previously been modified by another process. Eş zamanlı güncelleştirmeleri desteklemek için:To support concurrent updates:

  1. Güncelleştirilmekte olan nesnenin ETag öğesini alın.Get the ETag of the object being updated. Bu, herhangi bir varlıkla ilgili işlemin response değerinin parçası olarak döndürülür ve response['.metadata'].etag aracılığıyla alınabilir.This is returned as part of the response for any entity-related operation and can be retrieved through response['.metadata'].etag.

  2. Bir varlık üzerinde bir güncelleştirme işlemi gerçekleştirirken, önceden alınan ETag bilgilerini yeni varlığa ekleyin.When performing an update operation on an entity, add the ETag information previously retrieved to the new entity. Örneğin:For example:

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

  3. Güncelleştirme işlemini gerçekleştirin.Perform the update operation. Varlık, ETag değerini almanızın ardından değiştirildiyse, (örn. uygulamanızın başka bir örneği), istekte belirtilen güncelleştirme koşulunun karşılanmadığını belirten bir error döndürülür.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.

replaceEntity ve mergeEntity ile, güncelleştirilmekte olan varlık mevcut değilse, güncelleştirme işlemi başarısız olur; bu nedenle önceden mevcut olup olmadığında bakılmaksızın bir varlığı depolamak istiyorsanız, insertOrReplaceEntity veya insertOrMergeEntity kullanın.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.

Başarılı güncelleştirme işlemleri için result, güncelleştirilen varlığın Etag değerini içerir.The result for successful update operations contains the Etag of the updated entity.

Varlık gruplarıyla çalışmaWork with groups of entities

Bazen sunucu tarafından atomik işleme sağlamak için bir toplu işte birden fazla işlemin bir arada gönderilmesi mantıklıdır.Sometimes it makes sense to submit multiple operations together in a batch to ensure atomic processing by the server. Bunu yapmak için TableBatch sınıfını kullanarak bir toplu iş oluşturun ve sonra toplu işlemleri gerçekleştirmek için TableService için executeBatch yöntemini kullanın.To accomplish that, use the TableBatch class to create a batch, and then use the executeBatch method of TableService to perform the batched operations.

Aşağıdaki örnekte, bir toplu işte iki varlığın gönderilmesi gösterilmektedir: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
  }
});

Başarılı toplu işlemler için result, toplu işteki her bir işlemin bilgilerini içerir.For successful batch operations, result contains information for each operation in the batch.

Toplu işlemlerle çalışmaWork with batched operations

operations özelliğini görüntüleyerek bir toplu işe eklenen işlemleri inceleyebilirsiniz.You can inspect operations added to a batch by viewing the operations property. İşlemlerle çalışmak için aşağıdaki yöntemleri de kullanabilirsiniz:You can also use the following methods to work with operations:

  • clear: Bir toplu işteki tüm işlemleri temizler.clear - Clears all operations from a batch.
  • getOperations: Toplu işten bir işlem alır.getOperations - Gets an operation from the batch.
  • hasOperations: Toplu iş, işlemler içeriyorsa true değerini döndürür.hasOperations - Returns true if the batch contains operations.
  • removeOperations: Bir işlemi kaldırır.removeOperations - Removes an operation.
  • size: Toplu işteki işlem sayısını döndürür.size - Returns the number of operations in the batch.

Anahtara göre bir varlık almaRetrieve an entity by key

PartitionKey ve RowKey değerine dayalı belirli bir varlık döndürmek için retrieveEntity yöntemini kullanın.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
  }
});

Bu işlem tamamlandıktan sonra result, varlığı içerir.After this operation is complete, result contains the entity.

Varlık kümesini sorgulamaQuery a set of entities

Bir tabloyu sorgulamak için, TableQuery nesnesini kullanarak aşağıdaki yan tümceleri kullanıp bir sorgu ifadesi oluşturun:To query a table, use the TableQuery object to build up a query expression using the following clauses:

  • select: Sorgudan döndürülecek alanlar.select - The fields to be returned from the query.

  • where: Where yan tümcesi.where - The where clause.

    • and: Bir and where koşulu.and - An and where condition.
    • or: Bir or where koşulu.or - An or where condition.
  • top: Getirilecek öğe sayısı.top - The number of items to fetch.

Aşağıdaki örnek, bir 'hometasks' PartitionKey ile ilk beş öğeyi döndüren bir sorgu derler.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');

select kullanılmadığından, tüm alanlar döndürülür.Because select is not used, all fields are returned. Bir tabloya karşı sorguyu gerçekleştirmek için queryEntities kullanın.To perform the query against a table, use queryEntities. Aşağıdaki örnekte, 'mytable' içinden varlıkları döndürmek için bu sorgu kullanılır.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
  }
});

Başarılı olursa result.entries, sorguyla eşleşen varlık dizisini içerir.If successful, result.entries contains an array of entities that match the query. Sorgu tüm varlıkları döndüremediyse result.continuationToken, null değildir ve daha fazla sonuç almak için queryEntities öğesinin üçüncü parametresi olarak kullanılabilir.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. İlk sorguda, üçüncü parametre için null değerini kullanın.For the initial query, use null for the third parameter.

Giriş özellikleri alt kümesi sorgulamaQuery a subset of entity properties

Bir tabloya yapılan sorgu, bir varlıktan yalnızca birkaç alan alabilir.A query to a table can retrieve just a few fields from an entity. Bu, bant genişliğini azaltır ve özellikle büyük varlıklar için sorgu performansını iyileştirebilir.This reduces bandwidth and can improve query performance, especially for large entities. select yan tümcesini kullanın ve döndürülecek alanların adlarını geçirin.Use the select clause and pass the names of the fields to return. Örneğin, aşağıdaki sorgu yalnızca description ve dueDate alanlarını döndürür.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');

Bir varlığı silmeDelete an entity

Bölüm ve satır anahtarlarını kullanarak bir varlığı silebilirsiniz.You can delete an entity using its partition and row keys. Bu örnekte task1 nesnesi, silinecek varlığın RowKey ve PartitionKey değerlerini içerir.In this example, the task1 object contains the RowKey and PartitionKey values of the entity to delete. Daha sonra nesne, deleteEntity yöntemine geçirilir.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
  }
});

Not

Öğeleri silerken, öğenin başka bir işlem tarafından değiştirilmediğinden emin olmak için ETag’leri kullanın.Consider using ETags when deleting items, to ensure that the item hasn't been modified by another process. ETag’leri kullanma hakkında bilgi için bkz. Varlığı güncelleştirme.See Update an entity for information on using ETags.

Bir tablo silmeDelete a table

Aşağıdaki kod, bir depolama hesabından tabloyu siler.The following code deletes a table from a storage account.

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

Tablonun mevcut olup olmadığından emin değilseniz, deleteTableIfExists komutunu kullanın.If you are uncertain whether the table exists, use deleteTableIfExists.

Devamlılık belirteçlerini kullanmaUse continuation tokens

Büyük miktarda sonuçlar için tabloları sorguluyorsanız devamlılık belirteçlerine bakın.When you are querying tables for large amounts of results, look for continuation tokens. Bir devamlılık belirtecinin mevcut olup olmadığını belirlemek için derleme yapmıyorsanız, sorgunuz için fark etmeyebileceğiniz büyük miktarlarda veriler olabilir.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.

Varlıkları sorgulama sırasında döndürülen results nesnesi, böyle bir belirteç mevcut olduğunda bir continuationToken özelliği ayarlar.The results object returned during querying entities sets a continuationToken property when such a token is present. Daha sonra bölüm ve tablo varlıkları arasında hareket etmeye devam etmek için bir sorgu gerçekleştirirken bunu kullanabilirsiniz.You can then use this when performing a query to continue to move across the partition and table entities.

Sorgulama sırasında, sorgu nesnesi örneği ile geri çağrı işlevi arasında bir continuationToken parametresi sağlayabilirsiniz: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;
        }

    });

continuationToken nesnesini incelerseniz, tüm sonuçlar arasında yineleme yapmak için kullanılabilecek nextPartitionKey, nextRowKey ve targetLocation gibi özellikleri bulursunuz.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.

Ayrıca top ile birlikte continuationToken için sayfa boyutunu ayarlayın.You can also use top along with continuationToken to set the page size.

Paylaşılan erişim imzaları ile çalışmaWork with shared access signatures

Paylaşılan erişim imzaları (SAS), Depolama hesabı adınızı veya anahtarlarınızı sağlamadan tablolara ayrıntılı erişim sağlamanın güvenli bir yoludur.Shared access signatures (SAS) are a secure way to provide granular access to tables without providing your Storage account name or keys. SAS çoğu zaman verilerinize sınırlı erişim sağlamak (örneğin, bir mobil uygulamanın kayıtları sorgulamasına izin verme) için kullanılır.SAS are often used to provide limited access to your data, such as allowing a mobile app to query records.

Bulut tabanlı hizmet gibi güvenilir bir uygulama, TableService için generateSharedAccessSignature öğesini kullanarak bir SAS oluşturur ve bunu mobil uygulama gibi güvenilir olmayan veya yarı güvenilir uygulamaya sağlar.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’ın geçerli olduğu başlangıç ve bitiş tarihlerini ve SAS sahibine verilen erişim düzeyini açıklayan bir ilke kullanılarak SAS oluşturulur.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.

Aşağıdaki örnekte, SAS sahibinin tabloyu sorgulamasına ('r') olanak sağlayacak ve oluşturulduktan 100 dakika sonra geçerlilik süresi sona erecek yeni bir paylaşılan erişim ilkesi oluşturulur.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;

SAS sahibi tabloya erişmeye çalıştığında gerekli olacağı için ana bilgisayar bilgilerini de sağlamanız gerektiğini unutmayın.Note that you must also provide the host information, as it is required when the SAS holder attempts to access the table.

Daha sonra istemci uygulaması, tabloya karşı işlemleri gerçekleştirmek için TableServiceWithSAS ile SAS’ı kullanır.The client application then uses the SAS with TableServiceWithSAS to perform operations against the table. Aşağıdaki örnek, tabloya bağlanır ve bir sorgu gerçekleştirir.The following example connects to the table and performs a query. Bkz: paylaşılan erişim imzaları kullanma makalesine tableSAS biçimi.See using shared access signatures 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
  }
});

SAS yalnızca sorgu erişimiyle oluşturulduğundan, varlıklar eklemeye, güncelleştirmeye veya silmeye çalışırsanız bir hata döndürülür.Because the SAS was generated with only query access, an error is returned if you attempt to insert, update, or delete entities.

Erişim Denetim ListeleriAccess Control Lists

Ayrıca SAS için erişim ilkesini ayarlamak istediğinizde de bir Erişim Denetim Listesi (ACL) kullanabilirsiniz.You can also use an Access Control List (ACL) to set the access policy for a SAS. Birden çok istemcinin tabloya erişmesini, ancak her istemci için farklı erişim ilkeleri sağlamak istiyorsanız bu yararlıdır.This is useful if you want to allow multiple clients to access the table, but provide different access policies for each client.

Her politikayla ilişkilendirilmiş bir kimlik ile, bir erişim ilkeleri dizisi kullanılarak ACL uygulanır.An ACL is implemented using an array of access policies, with an ID associated with each policy. Aşağıdaki örnekte, biri 'user1' için ve biri de 'user2' için olmak üzere iki ilke tanımlanmaktadır: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
  }
};

Aşağıdaki örnek, hometasks tablosu için geçerli ACL’yi alır ve sonra setTableAcl kullanarak yeni ilkeler ekler.The following example gets the current ACL for the hometasks table, and then adds the new policies using setTableAcl. Bu yaklaşım aşağıdakilere olanak sağlar: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
      }
    });
  }
});

ACL ayarlandıktan sonra, bir ilke için kimliğe dayalı bir SAS oluşturabilirsiniz.After the ACL has been set, you can then create a SAS based on the ID for a policy. Aşağıdaki örnek, 'user2' için yeni bir SAS oluşturur:The following example creates a new SAS for 'user2':

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

Sonraki adımlarNext steps

Daha fazla bilgi için aşağıdaki kaynaklara bakın.For more information, see the following resources.