node.js: экспресс с мангустом - PullRequest
6 голосов
/ 10 апреля 2011

Я работаю над своим первым приложением node.js / express / mongoose и столкнулся с проблемой из-за механизма асинхронизации node.js. Кажется, я делаю это неправильно ...

Вот тестовый маршрут, который я определил, используя экспресс:

app.get('/test', function(req, res){
  var mod = mongoose.model('MyModel');
  mod.find({},function(err, records){
    records.forEach(function(record){
      console.log('Record found:' + record.id);
      // res.send('Thing retrieved:' + record.id);
    });
  });
});

Когда я выдаю http://localhost/test,, я бы хотел получить в ответ список записей типа «MyModel».

Приведенный выше код работает нормально, но когда дело доходит до возврата всего этого списка клиенту ... он не работает (закомментированная строка res.send) и возвращает только первую запись.

Я очень новичок в node.js, поэтому я не знаю, является ли это хорошим решением для встраивания нескольких функций обратного вызова в первую функцию обратного вызова app.get. Как мне вернуть весь список?

Есть идеи?

1 Ответ

9 голосов
/ 10 апреля 2011

Что вы должны сделать:

mod.find({},function(err, records){
  res.writeHead(200, {'Content-Length': body.length});
  records.forEach(function(record){
    res.write('Thing retrieved:' + record.id);
  });
});

Пожалуйста, всегда проверяйте также и документацию:

http://nodejs.org/docs/v0.3.8/api/http.html#response.write

Я пропустил, что вы используете экспресс,функция send является частью объекта express и extension, являющегося объектом serverResponse узла (мой плохой).

, но мой ответ по-прежнему применяется, функция send express отправляет данные с использованием ServerResponse.end(), поэтомусокет get закрыт, и вы больше не можете отправлять данные, используя функцию записи, используя встроенную функцию.

Возможно, вы также захотите вызвать res.end(), когда запрос будет полностью выполнен, так как некоторые элементы в выражении могут быть затронуты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...