NodeJS функций Azure: запрос Https не работает при использовании расширения кода Azure Visual Studio - PullRequest
1 голос
/ 05 июня 2019

Я работаю с функциями Azure в NodeJS.Я сначала написал функцию, имеющую функцию лазурного локально на моем ноутбуке.Код работал нормально и делал все, что хотел.Теперь я добавил код в новую функцию Azure в моем расширении кода Azure Visual Studio - точно такой же код.НО теперь это больше не работает.Я не получаю сообщение об ошибке или что-то, запрос https просто не запускается.

Вот мой код:

const https = require('https');
const fs = require('fs');
const storage = require('azure-storage');
const STORAGE_ACCOUNT_NAME = 'SOMETHING';
const ACCOUNT_ACCESS_KEY = 'SOMETHING';

const blobService = storage.createBlobService(STORAGE_ACCOUNT_NAME, ACCOUNT_ACCESS_KEY);

module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');
    let _browser;
    let _page;


    https.get(SOMEURL", (resp) => {
        let data = '';

        // A chunk of data has been recieved.
        resp.on('data', (chunk) => {
            data += chunk;
        });

        // The whole response has been received. Print out the result.
        resp.on('end', async () => {
            context.log('here');
        });

    }).on("error", (err) => {
        console.log("Error: " + err.message);
    });

};

Он никогда не печатает «здесь», что должно быть сделано после завершения запроса https.(Однако первый context.log напечатан в обоих случаях)

Итак, мой вопрос: что я делаю не так?Могу ли я не использовать запрос https внутри функций Azure при использовании расширения кода Visual Studio?

Редактировать:

всем, кому нужна асинхронность, приведена ссылка, объясняющая, как это сделать с помощью util.promisify: https://gist.github.com/krnlde/797e5e0a6f12cc9bd563123756fc101f

1 Ответ

1 голос
/ 05 июня 2019

Я сохранил ваш код обратного вызова. Я удалил прозвище async из определения и добавил вызов context.done (это сигнализирует хост функций после завершения вашей функции) в вашем обработчике resp.end

const https = require('https');
const fs = require('fs');
const storage = require('azure-storage');
const STORAGE_ACCOUNT_NAME = 'SOMETHING';
const ACCOUNT_ACCESS_KEY = 'SOMETHING';

const blobService = storage.createBlobService(STORAGE_ACCOUNT_NAME, ACCOUNT_ACCESS_KEY);

module.exports = function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');
    let _browser;
    let _page;


    https.get(SOMEURL", (resp) => {
        let data = '';

        // A chunk of data has been recieved.
        resp.on('data', (chunk) => {
            data += chunk;
        });

        // The whole response has been received. Print out the result.
        resp.on('end', async () => {
            context.log('here');
            context.done();
        });

    }).on("error", (err) => {
        console.log("Error: " + err.message);
    });

};

Другой вариант - сохранить функцию как async, но вам нужно будет заменить обратные вызовы вызовами на основе promise. В некоторых сценариях этого можно достичь, обернув их с помощью util.promisify , а затем вызвав их с ключевым словом await

...