1

我正在尝试在 VS Code 中开发一个函数,该函数将 url 作为输入并在处理完成后返回响应。然而,当这个函数运行时,它什么也不返回。我尝试在 Webstorm 中测试类似的代码,并确认它 console.logs 结果很好。我是节点新手并承诺,所以不确定我做错了什么。

编辑 - 根据@hellikiam 的建议,在 driver.get 之前添加了 return 关键字。还添加了一个简单的日志语句,以确认结果可用但未在正文中返回。

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();
}
4

1 回答 1

0

您没有从导出的模块返回任何内容。

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
                    }           
        });
        });

我发现了另一个问题。您要返回的是回调函数内部。您应该用 promise 包装回调以在回调之外获得结果。试试这个兄弟。


    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)
            });
       });
    
    })

使用 await 语句在模块外部调用此函数

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

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

于 2020-12-14T07:37:42.577 回答