我先说一下,我对编码还是很新鲜的,而且还在学习,
我正在尝试执行一个脚本,该脚本在node.js中使用两个异步函数。第一个函数使用傀儡手从网页中获取链接,第二个函数使用googleapi将数据记录到google表中。
我遇到的问题是,从第一个函数中获取的数组是第二个函数未定义的数组。
我认为这是第二个脚本在第一个脚本完成之前执行的问题,并且可以返回数据。任何洞察力或帮助都将不胜感激。
const puppeteer = require('puppeteer')
async function scrapeProduct(url) {
const browser = await puppeteer.launch({
headless: false
});
const page = await browser.newPage();
await page.goto(url);
const grablinks = await page.evaluate(() => {
//retrieves links
});
await browser.close();
return grabLinks;
}
const {google} = require('googleapis')
const credentials = require('')
const client = new google.auth.JWT(
credentials.client_email,
null,
credentials.private_key,
['https://www.googleapis.com/auth/spreadsheets']
);
client.authorize(function(err,tokens){
if (err){
console.log(err);
return;
} else{
console.log('Connected!');
gsrun(client);
}
});
async function gsrun(cl){
const gsapi = google.sheets({version: 'v4', auth: cl});
const grabLinks = await scrapeProduct();
const updateOptions = {
spreadsheetId: '',
range: '',
valueInputOption: 'USER_ENTERED',
resource: { values :grabLinks}
};
let res = await gsapi.spreadsheets.values.update(updateOptions);
}
执行时会遇到以下错误:
ProtocolError:协议错误(Page.navigate):无效参数无法反序列化params.url -绑定:在位置50处丢失的强制字段
50指client.authorize(函数(Err){)的结尾
发布于 2022-09-28 04:59:43
scrapeProduct
从不执行。将gsrun
函数更改为:
async function gsrun(cl,url){
const gsapi = google.sheets({version: 'v4', auth: cl});
let grabLinks = await scrapeProduct(url);
const updateOptions = {
spreadsheetId: '',
range: '',
valueInputOption: 'USER_ENTERED',
resource: { values :grabLinks}
};
let res = await gsapi.spreadsheets.values.update(updateOptions);
}
然后运行gsrun
,其中包含client
和所需的客户端中的url
。授权的回调是您编写的。
发布于 2022-09-28 05:19:41
首先,您只定义了scrapeProduct
,并且没有调用它:
async function gsrun(cl){
const gsapi = google.sheets({version: 'v4', auth: cl});
const grabLinks = await scrapeProduct(url); // <--- This
const updateOptions = {
spreadsheetId: '',
range: '',
valueInputOption: 'USER_ENTERED',
resource: { values: grabLinks}
};
let res = await gsapi.spreadsheets.values.update(updateOptions);
}
但是,这仍然会出错。这是因为您已经将scrapeProduct
定义为异步的( await
将无法工作,因为scrapeProduct
没有返回承诺),因此updateOptions.resource
将具有未定义的值。
您可以通过确保scrapeProduct
返回一个承诺来解决这个问题:
function scrapeProduct(url) {
return new Promise(async(resolve, reject) => {
const browser = await puppeteer.launch({
headless: false
});
const page = await browser.newPage();
await page.goto(url);
const grablinks = await page.evaluate(() => {
//retrieves links
});
await browser.close();
resolve(grabLinks);
});
}
现在,在await scrapeProduct(url)
中调用gsrun()
将工作,因为在从scrapeProduct
返回grabLinks
之前,代码不会进一步执行
https://stackoverflow.com/questions/73881730
复制相似问题