获取回调值并在另一个异步函数中使用它

时间:2019-08-05 16:15:55

标签: javascript node.js mongodb asynchronous puppeteer

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

我尝试使用其他函数从findOne()回调中获取值,但仍无法将其用于伪造者异步函数。

以下代码从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的范围在函数之内,但是即使我尝试将伪造者代码放置在函数storedata()内,我也会得到g未定义的错误。请帮助我更好地了解回调值。

1 个答案:

答案 0 :(得分:2)

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

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

  

...args <... Serializable | JSHandle>传递给pageFunction的参数

代码示例:

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

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