我正在尝试从我的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;
}
}
任何人都知道这里出了什么问题?任何指针都非常感激
答案 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