我有下面这段代码ExpressJS - 如何处理同时发生的请求?请求似乎阻止彼此。
var express = require('express');
var routes = require('./routes');
var http = require('http');
...
app.get('/a',function(){
Card.findCards(function(err, result){ //Mongoose schema
res.send(result); //Executes a query with 9000 records
})
});
app.get('/b', function(req, res){
res.send("Hello World");
});
我发现,当我做一个GET在localhost /年,需要约2.3秒即可完成。这并不奇怪,因为它从数据库中获取了相当多的数据。但是我发现如果我在/ a加载时GET/b,b将不会显示。就好像呼叫/ a阻止对/ b的呼叫一样。
这是表达应该如何工作?我总是假设个别路由是异步的,因为它们接受回调,但看起来像express一次只能处理一个请求。在调用res.end()之前,不会处理其他任何请求。我是否缺少我需要做的配置?
仅供参考,我这是怎么连接到猫鼬
mongoose.connect(dbConnectionString, {server:{poolSize:25}});
,这是我的http服务器初始化部分
http.globalAent.maxSockets = 20; // or whatever
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
编辑:这里是显卡型号代码和相关联的模式+功能
//Card.js
var mongoose = require('mongoose')
, Schema = mongoose.Schema;
var CardSchema = new Schema({
_id : {type: String},
stores : [{
store: {type: Schema.Types.ObjectId, ref:'StoreModel', required: true}
, points: {type: Number, required: true}
}]
});
exports.findCards = function(callback){
var query = Card.find({}, callback);
}
所以猫鼬分贝的呼叫阻塞?我一直认为数据库调用 - 就像输入一样 - 都是非阻塞的,因此使用了回调函数。 – pauloadaoag
Moongoose数据库调用是非阻塞的,因为您的应用程序不会因为等待mongo响应而被阻止,但是您的应用程序在从mongo到达时仍需要缓存和处理数千条记录,并且占用CPU周期反应堆 – bbozo
这可能是真的,但我做了一个测试,其中我在消耗猫鼬电话的CPU之前调用了res.send(“hello world”)。即使用简单的睡眠取代猫鼬呼叫,同样的事情仍然发生。即使发生猫鼬呼叫,Express仍然处理请求。因此我的结论是,在任何给定的时间只有一个请求/响应对象可以被快速处理。 (函数(err,)函数,函数(){' 'console.log(“a”);' 'res.send(“a”);' 'Card.findCards(function(err,结果){' 'console.log(“done”);' '})' '});' – pauloadaoag