Я пытаюсь использовать Microsoft Azure Storage SDK для загрузки файла из хранилища Azure.Моя работа основана на примере репозитория github (https://github.com/Azure-Samples/azure-storage-js-v10-quickstart/blob/master/index.js)
Когда я запускаю следующий пример кода, все работает правильно.
async function execute_download() {
const containerName = "myContainer";
const blobName = "myFile.json";
const credentials = new SharedKeyCredential(STORAGE_ACCOUNT_NAME, ACCOUNT_ACCESS_KEY);
const pipeline = StorageURL.newPipeline(credentials);
const serviceURL = new ServiceURL(`https://${STORAGE_ACCOUNT_NAME}.blob.core.windows.net`, pipeline);
const aborter = Aborter.timeout(30 * 60 * 1000);
const containerURL = ContainerURL.fromServiceURL(serviceURL, containerName);
const blockBlobURL = BlockBlobURL.fromContainerURL(containerURL, blobName);
const downloadResponse = await blockBlobURL.download(aborter, 0);
const downloadedContent = downloadResponse.readableStreamBody.read().toString();
const fs = require('fs');
fs.writeFile(blobName, downloadedContent, function(err) {
if(err) {
return console.log(err);
}
console.log("The file was saved!");
});
}
execute_download().then(() => console.log("Done")).catch((e) => console.log(e));
Но сейчас я пытаюсь интегрироватьэто в более сложный проект. Вот код:
function downloadFile(callback) {
async.waterfall([
function(callback) {
// do some stuff
callback(null);
},
// Download the new file
async function (callback) {
const credentials = new SharedKeyCredential(STORAGE_ACCOUNT_NAME, ACCOUNT_ACCESS_KEY);
const pipeline = StorageURL.newPipeline(credentials);
const serviceURL = new ServiceURL(`https://${STORAGE_ACCOUNT_NAME}.blob.core.windows.net`, pipeline);
const aborter = Aborter.timeout(30 * 60 * 1000);
const containerURL = ContainerURL.fromServiceURL(serviceURL, containerName);
const url = BlockBlobURL.fromContainerURL(containerURL, fileName);
const downloadResponse = await url.download(aborter, 0);
const downloadedContent = downloadResponse.readableStreamBody.read().toString();
console.log(`Downloaded file:\n "${downloadedContent}"`);
fs.writeFile(fileName, downloadedContent, function (err) {
if (err) {
callback(err);
}
console.log("The file was !");
callback(null);
});
},
function(callback) {
// do some stuff
callback(null);
}
], function (err) {
callback(err);
});
}
У меня ошибка TypeError: Cannot read property 'toString' of null
для строки с downloadResponse.readableStreamBody.read().toString()
. Я проверил содержимое downloadResponse
и не совпадает спервый пример. Он начинается с:
Я также пытаюсь заменить все вторые функции брандмауэра на:
// in waterfall:
function (callback) {
download(fileName).then(() => callback(null)).catch((e) => callback(e));
}
// somewhere else:
async function download(fileName) {
const credentials = new SharedKeyCredential(STORAGE_ACCOUNT_NAME, ACCOUNT_ACCESS_KEY);
const pipeline = StorageURL.newPipeline(credentials);
const serviceURL = new ServiceURL(`https://${STORAGE_ACCOUNT_NAME}.blob.core.windows.net`, pipeline);
const containerURL = ContainerURL.fromServiceURL(serviceURL, containerName);
const blockBlobURL = BlockBlobURL.fromContainerURL(containerURL, fileName);
//console.log(`Blobs in container:`);
//await showBlobNames(aborter, containerURL);
const downloadResponse = await url.download(aborter, 0);
const downloadedContent = downloadResponse.readableStreamBody.read().toString();
console.log(`Downloaded file:\n "${downloadedContent}"`);
fs.writeFile(fileName, downloadedContent, function (err) {
if (err) {
callback(err);
}
callback(null);
});
}
Но та же ошибка. Возможно, ошибка связана с тем, чтоЯ использую await
в async.waterfall
?
Можете ли вы помочь мне решить эту проблему? Спасибо