nodejs在从mongodb

时间:2015-08-27 08:47:14

标签: javascript ajax node.js mongodb

当我使用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只检索一个文档时,这没问题。

数据大小是否会导致问题?

0 个答案:

没有答案