2016-04-16 8 views
0

Исходя из мира .net, где синхронность является заданной, я могу запросить мои данные из исходного источника, такого как база данных, lucene или даже другой API, m с трудностью найти хороший образец этого для node.js, где async является нормой.node.js и hapi: выборка данных из базы данных синхронно

Проблема, с которой я сталкиваюсь, заключается в том, что клиент делает вызов API для моего hapi-сервера, а оттуда мне нужно взять параметры и сформировать запрос Elasticsearch для вызова, используя библиотеку request, а затем подождать для экземпляра, который должен вернуться до заполнения моего представления и отправки его обратно клиенту, проблема заключается в том, что библиотека запросов использует обратный вызов после возвращения данных, а пустой вид уже давно возвращается клиенту.

Попытка разместить возврат в обратном вызове не работает, поскольку EOF для javascript уже был удален, а null возвращен в его место, что является лучшим способом для извлечения данных в служебном вызове?

EX:

var request = require('request'); 
var options = { 
    url: 'localhost:9200', 
    path: {params}, 
    body: { 
    {params} 
    } 
} 

request.get(options, function(error, response){ 
    // do data manipulation and set view data 
} 

// generate the view and return the view to be sent back to client 
+0

Можете ли вы показать нам свой код hapi? –

ответ

1

Wrap запрос вызова в обработчике хапи гнездящимися обратных вызовов, так что задачи асинхронных выполняются в правильной логической последовательности. Псевдо код обработчика хапи выглядит следующим образом

function (request, reply) { 

    Elasticsearch.query((err, results) => { 

     if (err) { 
      return reply('Error occurred getting info from Elasticsearch') 
     } 

     //data is available for view 


    }); 


} 

Как я уже говорил ранее в вашем последнем вопросе, предварительно обработчиков использовать Хапи, чтобы помочь вам сделать асинхронную задачу, прежде чем ответить на ваш клиент. Дополнительную информацию см. В документах here. Также используйте wreck вместо запроса более прочный и простой в использовании