NodeJS请求在收到时使用json数据

时间:2017-11-23 09:11:21

标签: json node.js

我使用NodeJS请求从网址获取一些JSON,然后使用JSON对象获取数据。但我不知道如何使用这些数据,例如将它放在变量中而不会得到未定义的错误,因为它不会等待json响应通过。我看到了这个:https://www.twilio.com/blog/2015/10/asyncawait-the-hero-javascript-deserved.html

但我不能使用ES17功能/不想这样做。

示例1:基本请求

var request = require('request');

var url = 'https://api.github.com/users/rsp';

request.get({
    url: url,
    json: true,
    headers: {'User-Agent': 'request'}
  }, (err, res, data) => {
    if (err) {
      console.log('Error:', err);
    } else if (res.statusCode !== 200) {
      console.log('Status:', res.statusCode);
    } else {

      var jsonObj = data.html_url
    }
});

console.log(jsonObj)//未定义错误

# Example 2: Request promise
require("request/package.json"); // request is a peer dependency. 
var rp = require("request-promise")

var options = {
uri: 'http://api.open-notify.org/astros.json',
headers: {
    'User-Agent': 'Request-Promise'
},
json: true 
};

rp(options)
.then(function (jsonTest) {
    var jsonObj = jsonTest.number;
    console.log(jsonObj)
})
.catch(function (err) {
    // API call failed...
    console.log("failure")
});

那么如何更改上述任何一个示例,以便您可以在请求之外和以后的代码中使用json数据?

编辑:

我现在看到回调,promises,async / await都是异步的,并且都依赖于编写嵌套在其中的代码或代码等待等待它返回然后执行代码的代码。

我可以看到为什么Promises和async / await正在等待,即使回调可以做任何事情,异步代码也会变得非常丑陋和难以理解。这就是为什么我认为嵌套依赖回调的所有内容是错误的,但它很好。

2 个答案:

答案 0 :(得分:1)

对于您的回调示例,任何需要请求结果的内容都必须在回调中运行。见下文。

request.get({
    url: url,
    json: true,
    headers: {'User-Agent': 'request'}
  }, (err, res, data) => {
    if (err) {
      console.log('Error:', err);
    } else if (res.statusCode !== 200) {
      console.log('Status:', res.statusCode);
    } else {

      var jsonObj = data.html_url
      console.log(jsonObj) // error not defined //You must use the variable here. 
    }
});

原因是该回调之外的任何内容都将在回调之前执行。在您的特定情况下,回调实际上只会在console.log(jsonObj)

之后执行

答案 1 :(得分:0)

以下是如何使用不带ES6的请求执行此操作的简单示例

var request = require('request');
request('http://api.open-notify.org/astros.json', function (error, response, body) {
      var body = JSON.parse(body)
      console.log(body.number);
});