【问题标题】:Fetching callback value and using it inside another async function获取回调值并在另一个异步函数中使用它
【发布时间】:2019-12-13 04:53:16
【问题描述】:

我有一个连接到 MongoDb 的 Node.js 应用程序。我正在使用findOne() 从我的 mongodb 集合中检索某个 json,因此该值是在回调中获得的。我的应用程序还具有使用 puppeteer 的浏览器自动化任务。为了填写某个输入字段,我尝试使用从 mongodb 集合中检索到的 json。但由于异步性质,我无法在函数外使用回调值。我需要使用回调值作为 puppeteer 的输入发送。

我尝试使用另一个函数从 findOne() 回调中获取值,但仍然无法将其用于 puppeteer 异步函数。

以下代码从 mongodb 中获取值:

var g;


db.collection("users").findOne({}, function(err, result) {
    if (err) throw err;
    storedata(result);  

});

function  storedata (x){
    g = x;
    //console.log(g);
}

木偶代码:

(async () => {
    const browser = await puppeteer.launch({
        headless: false
    })
    const page = await browser.newPage();          

    await page.goto('http://0.0.0.0:4200/')

    await page.$eval('[placeholder="BPMN xml"]', el => {
        return el.value = g
    })
})()

我总是收到错误g is not defined。当然,我知道 g 的范围在函数内,但即使我试图将 puppeteer 代码放在函数 storedata() 内,我也会得到 g undefined 错误。请帮助我更好地理解回调值。

【问题讨论】:

  • 但是g 是在哪里定义的?它不在您的代码中。
  • pupeteer 代码和你的 mongoDB 代码在同一个文件中吗?
  • @ThomasDondorf 我已在顶部定义,但未在此处显示。然后我分配了 g = x 的值,认为它会简单地覆盖该值。
  • @dar 是的。它都在同一个文件 app.js 中
  • 尝试将 'g' 显式传递到您的匿名 Puppeteer 代码中,然后再次传递到您的 'page.$eval()' 回调中。那么它会识别“g”吗?

标签: javascript node.js mongodb asynchronous puppeteer


【解决方案1】:

问题是您将g 传递给浏览器环境。该变量仅存在于您的 Node.js 环境中,但您必须明确地将其传递给浏览器环境,以便您可以使用它。

引用自文档page.$eval 的第三个参数):

...args <...serializable> 传递给pageFunction的参数

代码示例:

await page.$eval('[placeholder="BPMN xml"]', (el, g) => {
    return el.value = g
}, g);

您将 g 作为第三个参数传递,然后它将成为页面内函数中的第二个参数。

【讨论】:

    猜你喜欢
    • 2021-02-21
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多