Функция Azure не возвращает ответ после завершения асинхронной функции

Я пытаюсь разработать функцию в VS Code, которая принимает URL-адрес в качестве входных данных и возвращает ответ после завершения обработки. Однако, когда эта функция запускается, она ничего не возвращает. Я пробовал тестировать аналогичный код в Webstorm и подтверждаю, что он отлично регистрирует результаты в console.log. Я новичок в узле и обещаниях, поэтому не уверен, что делаю неправильно.

Изменить - добавлено ключевое слово return перед driver.get в соответствии с предложением @hellikiam. Также добавлен простой оператор журнала, чтобы подтвердить, что результаты доступны, но не возвращаются в теле.

var AxeBuilder = require('@axe-core/webdriverjs'),
    WebDriver = require('selenium-webdriver');
const chromedriver = require('chromedriver');
const chrome = require("selenium-webdriver/chrome");
const screen = {
    width: 640,
    height: 480
  };

chrome.setDefaultService(new chrome.ServiceBuilder(chromedriver.path).build());
var driver = new WebDriver.Builder()
    .forBrowser('chrome')
    .setChromeOptions(new chrome.Options().headless().windowSize(screen))
    .build();
module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    const url = (req.query.url || (req.body && req.body.url));
    return driver.get(url).then(function () {
        new AxeBuilder(driver).analyze(function (err, results) {
            resultsJson = JSON.stringify(results);
            console.log(resultsJson)
                context.res = {
                    status: 200, /* Defaults to 200 */
                    body: resultsJson,
                    headers: {
                        'Content-Type': 'application/json'
                    }
                };

                if (err) {
                    // Handle error somehow
                    }           
            });
        });
   
    context.done();
}

person mitochondria    schedule 14.12.2020    source источник


Ответы (1)


вы ничего не вернули из экспортированного модуля.

return driver.get(url).then(function () {//add return statement in here.
        new AxeBuilder(driver).analyze(function (err, results) {
            resultsJson = JSON.stringify(results);
                context.res = {
                    status: 200, /* Defaults to 200 */
                    body: resultsJson,
                    headers: {
                        'Content-Type': 'application/json'
                    }
                };

                if (err) {
                    // Handle error somehow
                    }           
        });
        });

Я нашел другую проблему. То, что вы хотите вернуть, находится внутри функции обратного вызова. Вы должны обернуть обратный вызов обещанием, чтобы получить результат вне обратного вызова. Попробуй, брат.


    return new Promise((resolve, reject) =>{
       driver.get(url).then(function () {//add return statement in here.
            new AxeBuilder(driver).analyze(function (err, results) {
                resultsJson = JSON.stringify(results);
                    context.res = {
                        status: 200, /* Defaults to 200 */
                        body: resultsJson,
                        headers: {
                            'Content-Type': 'application/json'
                        }
                    };
                    resolve(resultsJson)//Any value you want to return
                    if (err) reject(err)
            });
       });
    
    })

Вызов этой функции вне модуля с оператором ожидания

const foo = require('./my/path/foo')

(async()=>{
    const params = 'my param'
    const bar = await foo(params)
    console.log(bar)
})()

person hellikiam    schedule 14.12.2020
comment
Привет, @hellikiam, спасибо за ответ. Я попытался добавить возврат в соответствии с вашим ответом, но поведение осталось прежним. Он возвращает ответ 200, но содержимое не возвращается. - person mitochondria; 14.12.2020
comment
вы ждали функции модуля в вызывающей стороне модуля? - person hellikiam; 14.12.2020