У меня есть следующий фрагмент кода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");
});
Я считаю, что, когда я делаю получить на локальном хосте/а, она занимает около 2,3 секунд. Это не удивительно, так как он извлекает из базы данных довольно много данных. Однако я обнаружил, что если I GET/b во время загрузки/b, b не будет отображаться. Это как если бы вызов/a блокировал вызов в/b.
Это как работает экспресс? Я всегда работал на предположениях, что отдельные маршруты являются асинхронными, поскольку они принимают обратные вызовы, но кажется, что экспресс может обрабатывать только один запрос за раз. До вызова 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'));
});
EDIT: Вот код для модели карты и связанные с ними схемы + функции
//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);
}
Так мангуст дБ звонки блокируются? Я всегда думал, что вызовы db - например, входные - не блокируют, следовательно, используют обратные вызовы. – pauloadaoag
Звонки на звонки в формате Moongoose не блокируются в том смысле, что ваше приложение не блокируется ожиданием ответа mongo, но вашему приложению по-прежнему необходимо буферизовать и обрабатывать несколько тысяч записей после их поступления из монго, и это занимает циклы процессора в реактор – bbozo
Это может быть правдой, но я сделал тест, в котором я вызвал res.send («hello world») перед тем, как процессор потребляет вызов мангуста. Даже заменил вызов мангуста простым просыпанием, и то же самое произошло. Экспресс все еще обрабатывал запросы даже во время вызова мангуста. Поэтому мой вывод состоит в том, что только один объект request/response может обрабатываться экспресс в любой момент времени. 'app.get ('/ a', function() {' 'console.log (" a ");' 'res.send (" a ");' 'Card.findCards (function (err, result) {' ' console.log ("done"); ' '}) ' '}); ' – pauloadaoag