我正在创建一个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不打印任何内容。我缺少什么?
答案 0 :(得分:1)
javascript中的每个return
语句仅属于其最近的周围函数。您的代码中有一个return语句,它属于与您预期不同的函数:
.then(body => {
...
return product;
})
因此return
语句将只向该函数返回一个值。
您的主函数getproducts
实际上没有返回语句,因此它确实返回未定义。在您的fetch
前面添加退货可以解决该问题,但我们尚未完成:
return fetch(url)
因为后面的fetch
和.then
-不仅会返回值。返回Promise
。承诺是很难的概念,在这里我将无法解释,因此,如果您不确定它们,我建议阅读更多有关它的内容:)
主要的收获是要从承诺中获得价值,您必须使用.then
或await
,稍后再讨论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);
})();