请求之外的数据未定义

时间:2016-11-24 03:03:33

标签: module web-scraping request node-modules cheerio

调用代码的部分。

** index.js **

var express = require('express');
var request = require('request');
var cheerio = require('cheerio');
var RagialJS     = express();

RagialJS.get('/scrape', function(req, res){

  console.log(getItemJSON("Minor Brisket", "Renewal"));

}) // End RagialJS.get

我希望这能打印出一个JSON对象,但返回undefined。

** getItemJSON() **

// Returns buy, sell, and metrics of item as a JSON
function getItemJSON(itemName, server) {
  var url = getItemURL(itemName, server);
  request(url, function(error, response, html) {
    if(!error && response.statusCode == 200) {
        var $ = cheerio.load(html);

        // Logic that parses and puts data in JSON here...

        // console.log(json); works here
        return json;
        } else {
          console.log(error);
        }
  }); // End request
// console.log(json); DOESN'T works here
}

这里的问题是,如果在请求结束之前我console.log(json);那么它工作正常,但如果我在请求(或其他函数)之外执行它,那么它返回undefined。 (getItemURL()

的问题相同

有没有办法解决这个问题?或者我是否忽略了有关数据请求的基本想法?

Full Source Code if interested

感谢任何帮助或评论。

1 个答案:

答案 0 :(得分:1)

主要问题是你正在进行异步调用,并期望以同样的方式获得结果。

请求函数第二个参数是在请求获得响应时调用的回调。

所以问题是:

request(url, function(error, response, html) {
    console.log('A');
}) // End Request
console.log('B');

您期望控制台输出为:

A
B

但输出是:

B
A

那是因为函数是异步的,当请求得到响应时它将被调用,并且代码在请求等待响应时继续执行。

*我已下载您的代码并更改了一些内容以进行测试,请告诉我您是否希望我将其发送给您。