Nodejs在从mongodb检索数据之前发送空响应
nodejs sends empty response before data retrieved from 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只检索一个文档时,这是没有问题的。
是数据大小导致的问题吗?
Try GeoJSON.parse
with callback
var data = {};
GeoJSON.parse(result, {Point:'loc', include:['poiname', 'uid', 'checkin_time']}, function (geojson) {
data['geojson'] = geojson;
res.json(data);
db.close();
});
相关文章:
- 如何在从浏览缓存加载页面时执行javascript
- 如何在从多选下拉列表中选择选项值时动态生成文本框
- Jquery(多读/少读)在从数据库加载整个数据后不起作用
- 错误:Can't在从forEach循环发送标头后设置标头
- 如何在从客户端接收数据时从本机方法触发javascript函数?
- JQuery FullCalendar在从ajax成功调用rerenderEvents时遇到问题
- Node.js错误“;ReferenceError:全局未定义“;在从0.10.2更新到0.12.2之后
- 防止函数在从ajax再次调用后多次运行
- 在从HTML表单提交时从javascript运行php
- Wordpress TinyMCE在从文本切换到视觉时,如果锚标记包裹块元素,则会删除锚标记
- 如何在从下拉列表中选择不同的值后更新和调用javascript函数
- Ajax在发送响应时从服务器读取响应
- API ajax 请求的进度条仅在从 API 获得响应后才会开始加载
- 如何在 $.ajax 响应中从 JSON 中提取数组
- 为什么我们在从ajax json调用获取响应时使用data.d
- 在ajax响应中从html获取输入值
- AJAX load-eventlistener在从服务器获得响应之前触发
- 在从JSON响应中获取值时,使用javascript解析JSON会使我无法定义
- Nodejs在从mongodb检索数据之前发送空响应
- 在Node.js服务器响应中从MongoDB抓取和发送元素