我有下面這段代碼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