2015-08-27 2 views
0

Когда я использую jQuery ajax для извлечения данных из nodejs (с помощью express4), nodejs отправляет пустой ответ обратно до загрузки данных из mongodb.nodejs отправляет пустой ответ перед данными, полученными из mongodb

Это сообщение от nodejs консоли:

GET /query?uid=1 - - ms - - 

И это сообщение об ошибке из консоли Chrome:

GET http://192.168.1.105:3000/query?uid=1 net::ERR_EMPTY_RESPONSE 

Я могу подтвердить, что данные загружены правильно из MongoDB, так как данные могут быть напечатан на консоли nodejs после того, как nodejs отправил пустой ответ. И это точно проблема. Почему nodejs отправляет ответ клиенту до того, как данные были подготовлены?

Я знаю, что nodejs является асинхронным, и я уделяю большое внимание этой замечательной функции, но у меня все еще есть эта проблема.

Это мой код клиента:

$.getJSON('/query', {uid:1}, function(response) { console.log('finished!'); }); 

И это мой код сервера:

var express = require('express'); 
var mongodb = require('mongodb'); 
var GeoJSON = require('geojson'); 
var strftime = require('strftime'); 
var router = express.Router(); 
var MongoClient = mongodb.MongoClient; 

router.get('/query', function(req, res, next) { 
    var url = "mongodb://localhost/example_db"; 
    var collection_name = "example_collection"; 

    var poi = req.query.poi ? req.query.poi.split("||") : null; 
    var time = req.query.time; 
    var uid = req.query.uid; 

    var condition = {}; 
    if (poi) condition.poiname = {$in: poi}; 
    if (time) condition.checkin_time = {$gte:new Date(time.start_time), $lte:new Date(time.end_time)}; 
    if (uid) condition.uid = parseInt(uid); 

    MongoClient.connect(url, function(err, db) { 
     if (err) console.log('connection error'); 

     var collection = db.collection(collection_name); 
     collection.find(condition).sort({checkin_time:1}).toArray(function(err, result) { 
      if (err) { 
       console.log(err); 
       return res.send('error!'); 
      } 

      if (!result) return res.send('no data'); 

      //This line prints the result after empty response has been sent. 
      console.log(result); 

      var data = {}; 
      data['geojson'] = GeoJSON.parse(result, {Point:'loc', include:['poiname', 'uid', 'checkin_time']}); 
      res.json(data); 
      db.close(); 
    }); 
}); 

Мои данные немного большим, 12G хранится в MongoDB. Поэтому для завершения запроса обычно требуется около 3 минут или более. Когда я использую findOne для извлечения только одного документа, это не проблема.

Возникает ли проблема с размером данных?

ответ

0

Try GeoJSON.parse с обратным вызовом

 var data = {}; 
     GeoJSON.parse(result, {Point:'loc', include:['poiname', 'uid', 'checkin_time']}, function (geojson) { 
      data['geojson'] = geojson; 
      res.json(data); 
      db.close(); 
     }); 
+0

Я модифицировал и проблема все еще существует. Я также замечаю, что пустые ответы отправляются примерно через 20 секунд после выполнения ajax. – kikyoakane

+0

Возможно, это ваши серверы Тайм-аут? Вы используете простой nodejs, или Nginx позади него? –

+0

nodejs с express4, без Nginx или apache. – kikyoakane

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