2015-09-30 225 views
0

使用我的node.js應用程序,我從電子表格API獲取JSON數據。 它基本上返回以下的JSON。Express node.js - 請求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":"" 
     } 
    ] 
} 

這只是一個虛擬的數據,但現在有一點可以肯定的是,我需要不同的處理下,博客的值(博客網址)。隨着博客的網址,我需要所以我使用了一個名爲open-graph-scraper

data.js我得到了整個JSON和它在路線提供index.jsdata模塊獲得的Open Graph數據然後,我通過檢查博客列來處理此data。如果匹配,我通過open-graph-scraper模塊循環值(博客URL)。

這會給我打開每個博客URL的圖形數據,如下面的示例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

你的問題是,如果你做getBlogData異步(你應該,你不希望客戶端等待所有的數據返回),當你獲得數據res.render將被調用。由於您無法再次致電res.render,因此您可以想到兩個選項:

  1. 您可以從客戶端查詢單個博客數據。這會在客戶端和服務器之間產生更多的反覆,但如果您的初始數據中有很多條目,但只希望顯示一小部分條目,則這是一個很好的策略。
  2. 當您檢索數據時,您可以使用websockets將數據發送到客戶端。查找類似express.io的簡單方法來執行此操作。
+0

我很高興你能理解我的問題。你的選擇1似乎更適合我的技能水平,但它會涉及視圖和回調中的回調函數,我需要解析JSON並使用HTML綁定,是嗎? –

+0

您需要添加一條新路線才能表達res.send博客數據。你需要添加一些JavaScript到你的頁面來發出請求並解析JSON。您可以使用XMLHttpRequest(它支持JSON,儘管名稱)和JSON.parse,或者如果您使用的是Angular或JQuery之類的東西,您可以使用它們並讓您的生活變得更輕鬆。 – piemonkey

+0

所以在這個路由中,我使用發送而不是渲染,因爲它沒有使用渲染,我需要發出請求來獲取這個發送的JSON。正確? –