在node.js中进行嵌套的请求调用

时间:2018-08-18 15:01:22

标签: node.js asynchronous web-scraping request async-await

正如标题所述,我正在尝试进行嵌套的请求调用,其中第一个请求从页面的html抓取一个img src,然后将该src传递给另一个请求。

var fs = require('fs');
var request = require('request');
var cheerio = require('cheerio');

async function main() {
    for (let i = 1; i < 1061; i++) {
        let url = `https://manuals.co/workshop/volkswagen/corrado/volkswagen-corrado-1990-1994-workshop-manual/5874057/${i}`

        await getSrc(url, i)
    }
}

async function getSrc(uri, j) {
    request(uri, function(error, response, html) {
        let $ = cheerio.load(html)
        const imgSrc = $('.bi.x0.y0.w0.h1').attr("src")
        console.log(imgSrc)
        request(imgSrc).pipe(fs.createWriteStream(`images/test-${j}.png`)).on('close', function() {
            console.log(`Completed image number: ${j}`)
        })
    })
}

main()

运行此命令时,“ imgSrc”作为“未定义”记录到控制台,并且出现错误:

Error: undefined is not a valid uri or options object.

我尝试如下使用await:

const imgSrc = await $('.bi.x0.y0.w0.h1').attr("src")

在这种情况下,我在该行上收到错误“意外的标识符”。 我还将指出,当我自己运行getSrc函数(不在for循环中)时,它会按预期运行。我不知该如何将其置于循环中而破裂。

我对node.js和异步编程非常陌生,因此我正在寻找一种可以帮助我了解这些工作原理的解决方案。

1 个答案:

答案 0 :(得分:0)

尝试同步运行它。删除asyncawait,看看是否仍然出现该错误。如果您仍然这样做,则$('.bi.x0.y0.w0.h1').attr("src")可能会返回未定义的值。