Express node.js - 请求JSON,异步处理它

时间:2015-09-30 09:30:56

标签: javascript json node.js

使用我的node.js应用,我可以从电子表格API获取我的JSON数据。 它基本上返回以下JSON。

{  
   "status":200,
   "success":true,
   "result":[  
      {  
         "Dribbble":"a",
         "Behance":"",
         "Blog":"http://blog.invisionapp.com/reimagine-web-design-process/",
         "Youtube":"",
         "Vimeo":""
      },
      {  
         "Dribbble":"",
         "Behance":"",
         "Blog":"http://creative.mailchimp.com/paint-drips/?_ga=1.32574201.612462484.1431430487",
         "Youtube":"",
         "Vimeo":""
      }
   ]
}

现在它只是一个虚拟数据但有一点可以肯定的是,我需要以不同方式处理Blog下的值(博客URL)。使用博客网址,我需要获取Open Graph数据,因此我使用名为open-graph-scraper的模块

使用 data.js 我获得了整个JSON,并且它在路径 index.js 中可用data然后我和通过选中博客列来处理此data。如果匹配,我将值(博客网址)循环到open-graph-scraper模块。

这将为我提供每个博客网址的开放图表数据,如下面的示例JSON。

{ 
data:
    { success: 'true',
         ogImage: 'http://davidwalsh.name/wp-content/themes/punky/images/logo.png',
         ogTitle: 'David Walsh - JavaScript, HTML5 Consultant',
         ogUrl: 'http://davidwalsh.name/',
         ogSiteName: 'David Walsh Blog',
         ogDescription: 'David Walsh Blog features tutorials about MooTools, jQuery, Dojo, JavaScript, PHP, CSS, HTML5, MySQL, and more!' },
      success: true 
}

所以我的目标是将这个博客JSON作为一个单独的数据从主JSON传递出去,并将它作为一个单独的对象放在渲染中,以便它可以作为两个独立的JSON在视图中使用。但我不确定我的getBlogData方法是否正确。 我甚至不确定在路由器文件中处理这样的数据是否是一件好事。我会很感激一些方向。

index.js

var ogs = require('open-graph-scraper'); 
var data = require('../lib/data.js');

data( function(data) {

    var getBlogData = function (callback) {

        var blogURL = [];

        if (data.length > 0) { 

            var columnsIn = data[0]; 

            for(var key in columnsIn) { 
                if (key === 'Blog') {
                    for(var i = 0; i < data.length; i++) {
                        blogURL += data[i][key];
                    }
                }   
            }
        };

        ogs({ 
            url: blogURL 
        }, function(er, res) { 
            console.log(er, res); 
            callback(res);
        });
    }

    getBlogData( function (blogData) {
       //I want to make this blogData available in render below 
         but don't know how
    });

    router.get('/', function(req, res, next) {
      res.render('index', { 
        title: 'Express', 
        data: data
      });
    });
});

data.js (我的获取JSON数据的模块)

module.exports = function(callback) {

    var request = require("request")
    var url = "http://sheetsu.com/apis/94dc0db4"

    request({
        url: url,
        json: true
    }, function (error, response, body) {

        if (!error && response.statusCode === 200) {

            var results = body["result"];
            callback(results)

        }
    })

}

1 个答案:

答案 0 :(得分:1)

你遇到的问题是,如果你异步地执行getBlogData(并且你应该,你不希望客户端等待所有数据返回),那么当你获得数据时res.render会有已被召唤。由于您无法再次调用res.render,因此您会想到两个选项:

  1. 您可以从客户端查询单个博客数据。这将导致客户端和服务器之间更多的来回,但如果您的初始数据中有大量条目但只想显示一小部分,这是一个很好的策略。
  2. 您可以使用websockets在检索时将数据发送到客户端。查找像express.io这样的简单方法。
相关问题