2015-09-30 2 views
0

С моим приложением node.js я получаю данные JSON из API таблиц. Он в основном возвращает 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":"" 
     } 
    ] 
} 

Это просто фиктивные данные сейчас, но одна вещь наверняка, что, мне нужно обрабатывать значения (блог URL) под блог по-разному. С URL блога, мне нужно, чтобы получить открытые данные Graph поэтому я использую модуль под названием open-graph-scraper

С data.js Я получаю всю JSON и он доступен в маршруте index.js в data Затем я обрабатываю этот data, проверяя столбцы блога. Если это совпадение, я перебираю значения (URL-адреса блога) через модуль open-graph-scraper.

Это даст мне открытые данные графика каждого 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, у вас есть 2 варианта, которые приходят на ум:

  1. Вы можете запросить отдельные данные блога у клиента. Это приведет к увеличению числа запросов между клиентом и сервером, но является хорошей стратегией, если у вас много записей в ваших исходных данных, но вы хотите отобразить только небольшое число.
  2. Вы можете использовать веб-порты для отправки данных клиенту по мере его получения. Посмотрите на что-то вроде express.io на простой способ сделать это.
+0

Я рад, что вы поняли мой вопрос. Ваш вариант 1 кажется более выполнимым для моего уровня мастерства, но он будет включать функцию обратного вызова в представлении и внутри обратного вызова, мне нужно будет разобрать JSON и связать с HTML, верно? –

+0

Вам нужно будет добавить новый маршрут, чтобы выразить res.send данные блога. Вам нужно добавить Javascript на свою страницу, чтобы выполнить запросы и разобрать JSON. Вы можете сделать это с помощью XMLHttpRequest (который поддерживает JSON, несмотря на имя) и JSON.parse, или если вы используете что-то вроде Angular или JQuery, вы можете использовать их и сделать вашу жизнь немного легче. – piemonkey

+0

Итак, в этом маршруте я использую send, а не render, и потому что он не использует render, мне нужно сделать запрос на получение этого отправленного JSON. Верный? –

Смежные вопросы