2013-03-29 3 views
0

Я хочу вернуть массив готовых ключевых историй, используя pivotal-node модуль для node.js.Как в node.js отправить ответ с массивом объектов json?

app.get('/delivered_stories', function(request, response) {    
    pivotal.useToken("my_token"); 
    pivotal.getProjects(function (err, data) { 
    var project_ids = data.project.map(function(x) { return parseInt(x.id); }); 
    console.log('Retrived project ids: '.blue + project_ids); 

    project_ids.forEach(function(id) { 
     pivotal.getStories(id, { filter: "state:finished" }, function(err, story) { 
     response.send(story); 
     }); 
    }); 
    response.end(); // End the JSON array and response. 
    }); 
}); 

Что я делаю неправильно? И как это исправить? Я получаю сообщение об ошибке:

http.js:708 
    throw new Error('Can\'t set headers after they are sent.'); 
     ^
Error: Can't set headers after they are sent. 

Всего код: https://gist.github.com/regedarek/30b2f35e92a7f98f4e20

ответ

2

pivotal.getStories() является асинхронный.

Его обратный вызов (и, следовательно, response.send()) будут работать некоторое время после того, как остальной части кода (включая response.end())

В самом деле, вы не должны называть response.end() вообще; response.send() делает это за вас.

Вы также не можете позвонить по телефону response.send() более одного раза; вам нужно объединить все результаты в один массив и отправить их.
Это непросто сделать; рассмотрите возможность использования async.js или обещаний.

+0

Итак, как я могу хранить '' project_ids'' и передавать его в getStories? – tomekfranek

+0

@regedarek Взгляните на асинхронную библиотеку для координации асинхронных задач. https://github.com/caolan/async – UpTheCreek

+0

К сожалению, только что увидел, что в ответе упоминается, что все еще стоит повторить;) – UpTheCreek