当我使用jQuery ajax从nodejs(使用express4)检索数据时,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只检索一个文档时,这没问题。
数据大小是否会导致问题?