gpt4 book ai didi

node.js - ExpressJS - 如何处理同时请求?请求似乎相互阻塞。

转载 作者:搜寻专家 更新时间:2023-10-31 22:34:34 27 4
gpt4 key购买 nike

我有如下一段代码

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");
});

我发现当我在 localhost/a 上进行访问时,大约需要 2.3 秒才能完成。这并不奇怪,因为它从数据库中获取了相当多的数据。但是我发现如果我在加载/a 时获取/b,b 将不会显示。就好像对/a 的调用正在阻止对/b 的调用。

这就是 express 的工作方式吗?我一直假设各个路由是异步的,因为它们接受回调,但似乎 express 一次只能处理一个请求。在调用 res.end() 之前,不会处理其他请求。我是否缺少任何我需要做的配置?

作为引用,这是我连接 Mongoose 的方式

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);
}

最佳答案

我遇到了同样的问题,设置与您的类似。有两个问题,它们都有相同的根本原因:Node 具有非阻塞 I/O 操作,但是(正如 bbozo 指出的那样)CPU 密集型操作确实会阻塞它。

第一个问题出在你的 Mongoose 调用上。 Mongoose 从您的集合中检索文档后,会将它们转换为 Mongoose 对象。如果你得到 9000 条记录,它将执行 9000 次。有问题的行在 mongoose 的 query.js 库中;查看其 completeMany 函数上的 for 循环以找到相关的阻塞操作。

第二个问题出现在 Express 将生成的 JSON 对象字符串化以发送您的响应时。罪魁祸首是 Express 的 response.js 库下的 res.json 函数。对于大型响应,stringify 的阻塞特性将很明显。

我不太确定如何解决这个问题。您可能会尝试使用 mongodb 的本地库,而不是 mongoose。您还可以尝试修补 Express,使其使用 JSON 流调用而不是阻塞式字符串化。查询和响应的分页也会有所帮助,但我知道实现起来不是很简单。

关于node.js - ExpressJS - 如何处理同时请求?请求似乎相互阻塞。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21254883/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com