我有一个连接到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未定义的错误。请帮助我更好地了解回调值。
答案 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作为第三个参数传递,然后它将成为页面内函数中的第二个参数。