使用'azure-storage'生成用于Blob存储的SAS npm无法正常工作

时间:2015-02-22 15:55:09

标签: node.js azure-storage azure-mobile-services azure-storage-blobs

我正在尝试从我的azure-mobile-services中的自定义api获取azure blob-storage中blob的SAS访问URL。为此,我使用azure-storage节点模块,使用此how-to指南。我在mobile-serivces配置中设置了所需的AZURE_STORAGE_ACCOUNT和AZURE_STORAGE_ACCESS_KEY env变量。下面是我为此提供的代码片段。从日志中我可以看到' blobService.generateSharedAccessSignature'成功返回sasQueryUrl对象,记录器代码行

 logger.info('sasQueryUrl=', sasQueryUrl);

返回 -

sasQueryUrl="st=2015-02-22T03%3A28%3A25Z&se=2015-02-22T03%3A48%3A25Z&sp=w&sv=2014-02-14&sr=b&sig=MUG7LT4Fe%2BGLu5lAa%2FgIXQM33AKtBDNrnEOV9H9FzBE%3D" st=2015-02-22T03%3A28%3B45Q&se=2015-02-22T03%3A48%3A25Z&sp=w&sv=2014-02-14&sr=b&sig=MEU7DE4Fe%2BGLu5lAa%2FgIAQTM33AKtBDNrnEOV9H9FzBE%3D [object Object])

但是下面的记录器代码行

logger.info('sasQueryUrl.queryString = ' + qs.stringify(sasQueryUrl.queryString));

日志 -

sasQueryUrl.queryString = [object Object],

所以 qs 不会对sasQueryUrl.queryString进行字符串化。因此,我无法为blob构建SAS URL。

以下是我的功能代码 -

function getImageBlobSASURL(item, callback){
    var iM = 'api.images.getImageBlobSASURL -";
    try {
        var azureStrg = require('azure-storage');
        var qs = require('querystring');
        var retryOperationFilter = new azureStrg.ExponentialRetryPolicyFilter();
        var blobService = azureStrg.createBlobService().withFilter(retryOperationFilter);

        var containerName = item.image.container.toLowerCase();
        blobService.createContainerIfNotExists(containerName, function(err, containerCreatedResultFlag, response) {
            if (err) {
                throw new Error(iM + "couldn't create container-" + containerName + ".Error=" + err);
            }

            //Create SAS for the BLOB with write access to the container for the next 10 mins.
            var startDate = new Date();
            var expiryDate = new Date(startDate);
            expiryDate.setMinutes(startDate.getMinutes() + 10);
            startDate.setMinutes(startDate.getMinutes() - 10);

            var sharedAccessPolicy = {
                AccessPolicy: {
                    Permissions: azureStrg.BlobUtilities.SharedAccessPermissions.WRITE,
                    Start: startDate,
                    Expiry: expiryDate
                }
            };

            var sasQueryUrl = blobService.generateSharedAccessSignature(containerName, '' , sharedAccessPolicy);

            logger.info(iM + 'sasQueryUrl=', sasQueryUrl);

            logger.info(iM + 'sasQueryUrl.queryString =' + qs.stringify(sasQueryUrl.queryString));
            item.image.sas.qstr = qs.stringify(sasQueryUrl.queryString); //Set the query string.

            //Set the full path on the new new item, which is used for data binding on the client.
            item.image.url = sasQueryUrl.baseUrl + sasQueryUrl.path + '/' + item.image.resourceName;

            logger.info(iM + 'Received sas URI for the resource=', item.image);
            callback.success(containerCreatedResultFlag, item);
        }
    }
    catch(err){
        logger.error( iM + 'error - ' + err);
        callback.error(err);
        return false;
    }

}

任何人都知道这里出了什么问题?任何指针都非常感激

1 个答案:

答案 0 :(得分:2)

blobService.generateSharedAccessSignature本身序列化查询字符串并将其作为字符串而不是对象返回。因此,库在返回之前已经在查询字符串对象上调用了qs.stringify。这使得用户在想要使用SAS令牌执行操作时可以轻松使用它,因为blob服务创建API直接采用查询字符串的字符串形式,如下所示 -

var sharedAccessSignatureToken = blobService.generateSharedAccessSignature(container, blob, sharedAccessPolicy);

var sharedBlobService = azure.createBlobServiceWithSas(blobService.host, sharedAccessSignatureToken);

// Download the blob properties by using the shared access signature URL. 
sharedBlobService.getBlobProperties(container, blob, function (error) {
if (error) {
  console.log(error);
} 
}

如果您想使用SAS令牌作为对象,请使用qs.parse创建查询字符串对象。

如果您更愿意使用SAS令牌生成Uri,请按以下方式构建Uri -

uri = blobService.host.primaryHost + '/' + container + '?' + sharedAccessSignatureToken