Используйте функцию async в async.waterfall - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь использовать 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?

Можете ли вы помочь мне решить эту проблему? Спасибо

...