Node.js 查询后的回调函数较慢时mongodb连接超时
我正在开发一个web应用程序的后端。服务器端,节点与express和mongo(通过mongoose)一起使用 客户端可以发出post请求,该请求执行以下操作:Node.js 查询后的回调函数较慢时mongodb连接超时,node.js,mongodb,express,mongoose,timeout,Node.js,Mongodb,Express,Mongoose,Timeout,我正在开发一个web应用程序的后端。服务器端,节点与express和mongo(通过mongoose)一起使用 客户端可以发出post请求,该请求执行以下操作: 从mongo加载某些数据的文件位置 加载文件并用它做一些繁重的工作 将结果发送到客户端 这是由一个如下所示的函数完成的: function (req, res, next) { // read relevant info from req object, e.g. var id = req.body.id; mySc
- 从mongo加载某些数据的文件位置
- 加载文件并用它做一些繁重的工作
- 将结果发送到客户端
function (req, res, next) {
// read relevant info from req object, e.g.
var id = req.body.id;
mySchema.findById(id, (err, doc) => {
fs.readFile(doc.location, function (err, data) {
// do some heavy work with data
res.statusCode = 200;
res.setHeader('Content-Type', 'application/json');
var bodyContent = [];
// fill bodyContent
res.write(JSON.stringify(bodyContent));
res.end();
});
});
};
这适用于小文件,但当文件变大且“繁重工作”的计算需要更长时间才能执行时,mongo会抛出连接超时错误:
Error: connection timeout
at Db.<anonymous> (<project path>/node_modules/mongoose/lib/drivers/node-mongodb-native/connection.js:169:17)
at emitTwo (events.js:106:13)
at Db.emit (events.js:191:7)
at Server.listener (<project path>/node_modules/mongoose/node_modules/mongodb/lib/db.js:1798:14)
at emitOne (events.js:96:13)
at Server.emit (events.js:188:7)
at Server.<anonymous> (<project path>/node_modules/mongoose/node_modules/mongodb/lib/server.js:274:14)
at emitOne (events.js:96:13)
at Server.emit (events.js:188:7)
at Pool.<anonymous> (<project path>/node_modules/mongoose/node_modules/mongodb-core/lib/topologies/server.js:335:12)
at emitOne (events.js:96:13)
at Pool.emit (events.js:188:7)
at Connection.<anonymous> (<project path>/node_modules/mongoose/node_modules/mongodb-core/lib/connection/pool.js:270:12)
at Connection.g (events.js:291:16)
at emitTwo (events.js:106:13)
at Connection.emit (events.js:191:7)
at Socket.<anonymous> (<project path>/node_modules/mongoose/node_modules/mongodb-core/lib/connection/connection.js:185:10)
at Socket.g (events.js:291:16)
at emitNone (events.js:86:13)
at Socket.emit (events.js:185:7)
at Socket._onTimeout (net.js:339:8)
at ontimeout (timers.js:365:14)
at tryOnTimeout (timers.js:237:5)
at Timer.listOnTimeout (timers.js:207:5)
错误:连接超时
在分贝,但没有用。解决这一问题的最佳途径是什么
更新:
更仔细地研究这个问题,一个可能的解决方案似乎是在回调开始时断开Mongo,例如通过mongoose.connection.close()
并在res.end()
行之前重新连接,类似于mongoose.connect(config)
。然而,我还没有找到一种方法来做到这一点,即当有多个请求传入时,它可以正常工作。有什么想法吗