Webscrapper函数返回未定义

时间:2019-01-10 23:03:12

标签: javascript node.js

我正在创建一个webscrapper函数以使用数据创建一个json,webscrapper部分起作用了,更奇怪的是该函数返回了undefined

getproduct.js

module.exports.getproduct = url => {
  fetch(url)
    .then(response => response.text())
    .then(body => {
      let product;
      const $ = cheerio.load(body);
      product = {
        productName: $(".product-name").text()
      };
      console.log(product);
      return product;
    });
};

index.js

const {getproduct} = require('./webScrapper/getproduct');

console.log(getproduct('https://www.americanas.com.br/produto/134118928'));

console.log(product);工作正常,但index.js上的console.log不打印任何内容。我缺少什么?

2 个答案:

答案 0 :(得分:1)

javascript中的每个return语句仅属于其最近的周围函数。您的代码中有一个return语句,它属于与您预期不同的函数:

.then(body => {
  ...
  return product;
})

因此return语句将只向该函数返回一个值。 您的主函数getproducts实际上没有返回语句,因此它确实返回未定义。在您的fetch前面添加退货可以解决该问题,但我们尚未完成:

return fetch(url)

因为后面的fetch.then-不仅会返回值。返回Promise。承诺是很难的概念,在这里我将无法解释,因此,如果您不确定它们,我建议阅读更多有关它的内容:)

主要的收获是要从承诺中获得价值,您必须使用.thenawait,稍后再讨论await,让我们继续{{1} }首先:

.then

现在,人们意识到编写所有以getproduct('https://www.americanas.com.br/produto/134118928') .then(product => { console.log('product:', product); }); -s为单位履行诺言的代码会有点令人沮丧,因此我们(javascript社区)发明了.then(...).then(...)。这样,您可以像这样编写代码:

async/await

现在看起来好多了,您可以看到module.exports.getproduct = async (url) => { let response = await fetch(url); let body = await response.text(); let $ = cheerio.load(body); let product = { productName: $(".product-name").text() }; console.log(product); return product; }; 语句实际上再次在正确的函数中!但是请注意,您仍然不必忘记将return放在通常需要await结尾的函数之前,但是绝对容易。

现在.then有点棘手,因为您只能在标有index.js的函数中使用await,但我们可以:

async

我希望您可以从这里前进一点:)

答案 1 :(得分:0)

应添加异步函数包装器并等待诺言

// getproduct.js

module.exports.getproduct = url => {
  fetch(url)
    .then(response => response.text())
    .then(body => {
      const $ = cheerio.load(body);
      const product = {
        productName: $(".product-name").text()
      };
      console.log('getproduct.js > product', product);
      return product;
    });
};


//index.js updated file

const {getproduct} = require('./webScrapper/getproduct');

(async () => {
   const product = await getproduct('https://www.americanas.com.br/produto/134118928');
   console.log('index.js > product', product);
})();