Javascript函数中的未定义/空变量
我对以下代码有一些问题。我有一个api可以获取不同的URL。根据我拥有的URL,操作会有所不同,所以我做了一个函数来检测我要对其进行操作的站点。现在看起来是这样的:Javascript函数中的未定义/空变量,javascript,node.js,function,variables,Javascript,Node.js,Function,Variables,我对以下代码有一些问题。我有一个api可以获取不同的URL。根据我拥有的URL,操作会有所不同,所以我做了一个函数来检测我要对其进行操作的站点。现在看起来是这样的: router.get('/:url(*)', async function (req, res) { let jsonObject; jsonObject= await chooseScrapperFromUrl(req.params.url); res.json(jsonObject
router.get('/:url(*)', async function (req, res) {
let jsonObject;
jsonObject= await chooseScrapperFromUrl(req.params.url);
res.json(jsonObject);
}
async function chooseScrapperFromUrl(url) {
let jsonObject= '';
if (url.includes('www.someSite.com')) {
jsonObject= await someSiteScrapper(url);
}
return jsonObject;
}
async function someSiteScrapper(url) {
let jsonObject= '';
try {
//creating the jsonObject variable here ...
//jsonObject = //some cheerio calls here but nothing more
request(url, (error, response, html) => {
if (!error && response.statusCode == 200) {
const $ = cheerio.load(html);
$('.pb-center-column').each((i, el) => {
const productName= $(el).find('#something').find('span').text().replace(/\s\s+/g, ' ').trim();
jsonObject+= '{ "name": "' + productName;
let price= $(el).find('.price').text().trim();
jsonObject+= '"price": ' + parseFloat(price) + ', ';
jsonObject+= '"originUrl": "' + url + '"}';
} catch (err) {
console.log(err);
}
return jsonObject;
}
您可以看到,我拥有的变量jsonObject
是在somesitescarser
函数中创建的,应该返回到我的路由,它将发送到我的前端客户端。我进行了检查,并在try
/catch
循环中创建了jsonObject
,但一旦我退出循环,它将为空或未定义。我不明白为什么
你能帮我吗?试着答应一下。。。这是因为您在更改之前返回了值
async function someSiteScrapper(url) {
return new Promise((resolve, reject) => {
let jsonObject= '';
try {
//creating the jsonObject variable here ...
//jsonObject = //some cheerio calls here but nothing more
request(url, (error, response, html) => {
if (!error && response.statusCode == 200) {
const $ = cheerio.load(html);
$('.pb-center-column').each((i, el) => {
const productName= $(el).find('#something').find('span').text().replace(/\s\s+/g, ' ').trim();
jsonObject+= '{ "name": "' + productName;
let price= $(el).find('.price').text().trim();
jsonObject+= '"price": ' + parseFloat(price) + ', ';
jsonObject+= '"originUrl": "' + url + '"}';
});
resolve(jsonObject);
} catch (err) {
reject(err);
}
});
}
试着承诺。。。这是因为您在更改之前返回了值
async function someSiteScrapper(url) {
return new Promise((resolve, reject) => {
let jsonObject= '';
try {
//creating the jsonObject variable here ...
//jsonObject = //some cheerio calls here but nothing more
request(url, (error, response, html) => {
if (!error && response.statusCode == 200) {
const $ = cheerio.load(html);
$('.pb-center-column').each((i, el) => {
const productName= $(el).find('#something').find('span').text().replace(/\s\s+/g, ' ').trim();
jsonObject+= '{ "name": "' + productName;
let price= $(el).find('.price').text().trim();
jsonObject+= '"price": ' + parseFloat(price) + ', ';
jsonObject+= '"originUrl": "' + url + '"}';
});
resolve(jsonObject);
} catch (err) {
reject(err);
}
});
}
实际上什么是治疗?也许你在里面使用了king和async函数,但是你在值受到影响之前返回了值…我做了建议的编辑,治疗中只有cheerio调用,这都是错的,重要的是你正在做的请求。。。它是异步的……实际上什么是治疗?也许你在里面使用了king和async函数,但是你在值受到影响之前返回了值…我做了建议的编辑,治疗中只有cheerio调用,这都是错的,重要的是你正在做的请求。。。它是异步的。。。。