【问题标题】:How to dynamically read external json files in node.js?如何在 node.js 中动态读取外部 json 文件?
【发布时间】:2016-09-21 08:12:35
【问题描述】:

我正在创建一个网站,它读取外部托管的 json 文件,然后使用 node.js 填充网站内容。

只是为了展示我所追求的,这是我在 node.js 中尝试做的一个非常简化的版本

var ids = [111, 222, 333];

ids.forEach(function(id){
    var json = getJSONsomehow('http://www.website.com/'+id+'.json');

    buildPageContent(json);
});

我想做的事可能吗?

(标记为“How do I return the response from an asynchronous call?”的重复项,请参阅下面的评论以获得我的反驳)

【问题讨论】:

  • 我不相信它是重复的,因为这个问题专门围绕 node.js 而这个问题是围绕基于浏览器的 javascript。 node.js 与基于浏览器的 JS 是一个非常不同的平台,因为 node.js 操纵系统上的文件,而浏览器 js 操纵网站的 DOM。 node.js 也可以访问 gazzillion npm 插件,因此使用 npm 插件而不是使用 ajax 可能是更好的解决方案,因为 ajax 主要是为基于浏览器的 javascript 设计的。此外,npm 本身并不支持 XMLHttpRequest,而基于浏览器的 js 则支持。
  • 不,差不多。唯一的主要区别是 API。异步 JavaScript 的概念和语法完全相同。无论是回调、生成器还是承诺。如果您真的阅读过副本,您就会明白这一点。
  • 问题不是问如何做异步js。它主要是询问如何使用 node.js 从外部源访问内容。

标签: json node.js


【解决方案1】:

您正在尝试同步获取它。相反,您应该瞄准的不是这样使用的函数:

var json = getJSONsomehow('http://www.website.com/'+id+'.json');

但更像这样:

getJSONsomehow('http://www.website.com/'+id+'.json', function (err, json) {
  if (err) {
    // error
  } else {
    // your json can be used here
  }
});

或者像这样:

getJSONsomehow('http://www.website.com/'+id+'.json')
  .then(function (json) {
    // you can use your json here
  })
  .catch(function (err) {
    // error
  });

您可以使用request 模块通过以下方式获取数据:

var request = require('request');
var url = 'http://www.website.com/'+id+'.json';

request.get({url: url, json: true}, (err, res, data) => {
  if (err) {
    // handle error
  } else if (res.statusCode === 200) {
    // you can use data here - already parsed as json
  } else {
    // response other than 200 OK
  }
});

有关工作示例,请参阅this answer

欲了解更多信息,请参阅:https://www.npmjs.com/package/request

【讨论】:

    【解决方案2】:

    我认为问题出在异步请求中。函数会在请求完成之前返回结果。

    AJAX_req.open( "GET", url, true );
    

    第三个参数指定异步请求。

    你应该添加处理程序并在请求完成后做你想做的一切。

    例如:

    function AJAX_JSON_Req( url ) {
        var AJAX_req = new XMLHttpRequest.XMLHttpRequest();
        AJAX_req.open( "GET", url, true );
        AJAX_req.setRequestHeader("Content-type", "application/json");
    
        AJAX_req.onreadystatechange = function() {
            if (AJAX_req.readyState == 4 && AJAX_req.status == 200) {
                console.log(AJAX_req.responseText);
            }
        };
    }
    

    【讨论】:

      猜你喜欢
      • 2018-10-22
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      • 1970-01-01
      相关资源
      最近更新 更多