Я пытаюсь создать несколько API для моего мобильного приложения. Я использую Node + Express + Mongo + Firebase. На основе предложений, приведенных в других местах ( Как правильно повторно использовать соединение с Mongodb через приложение и модули NodeJs ), я создал следующую структуру кода:
Это то, что у меня есть в моем mongoUtils.js:
const MongoClient = require('mongodb').MongoClient
const uri = "mongodb+srv://user:password@blabla.azure.mongodb.net/bla?retryWrites=true&w=majority";
let _db
const connectDB = async (callback) => {
try {
MongoClient.connect(uri,{ useNewUrlParser: true }, (err, client) => {
_db = client.db('ABC');
return callback(err)
})
} catch (e) {
throw e
}
}
const getDB = () => _db
const disconnectDB = () => _db.close()
module.exports = { connectDB, getDB, disconnectDB }
Это то, что у меня есть в моем index.js:
const functions = require('firebase-functions');
const express = require('express');
const app = express();
var cors = require('cors');
app.use(cors());
const admin = require('firebase-admin');
const bodyParser = require('body-parser')
const assert = require('assert');
const MongoDB = require('./db/mongoUtils')
admin.initializeApp(functions.config().firebase);
app.use(bodyParser.urlencoded({ extended: true }))
app.use(bodyParser.json())
app.post('/getUserByPhone',(request,response)=>{
MongoDB.connectDB(async (err) => {
assert.equal(null, err);
console.log("Connected correctly to server");
const db = MongoDB.getDB();
const collection = db.collection('users');
console.log(request.body.phone);
// Find some documents
collection.find({/*Query here*/}).toArray(function(err, docs) {
assert.equal(err, null);
console.log("Found the following records");
console.log(docs)
response.send(docs);
})
})
})
app.post('/getUserById',(request,response)=>{
var ObjectId = require('mongodb').ObjectId;
var id = request.body.userId;
var userId = new ObjectId(id);
MongoDB.connectDB(async (err) => {
assert.equal(null, err);
const db = MongoDB.getDB();
console.log("Connected correctly to server");
const collection = db.collection('users');
collection.find({/*Query*/}).toArray(function(err, docs) {
assert.equal(err, null);
console.log("Found the following records");
console.log(docs)
response.send(docs);
})
})
})
app.post('/moreFunction',async(request,response)=>{
var currTime = new Date();
MongoDB.connectDB(async (err) => {
assert.equal(null, err);
const db = MongoDB.getDB();
const collection = db.collection('coll_2');
collection.find().toArray(function(err, docs) {
assert.equal(err, null);
response.send(docs);
});
})
})
app.post('/anotherFunction',async(request,response)=>{
MongoDB.connectDB(async (err) => {
assert.equal(null, err);
const db = MongoDB.getDB();
console.log("Connected correctly to server");
const collection = db.collection('coll_name');
collection.find().toArray(function(err, docs) {
assert.equal(err, null);
response.send(docs);
});
})
})
exports.api = functions.https.onRequest(app);
Теперь, когда угодноЯ тестирую свое приложение, запустив его на своем Android-устройстве, и я вижу всплеск соединений в моей консоли MongoDb. Вместо одного соединения я вижу, что приложение использует около 25-30 соединений при навигации между экранами. Что не так с моим подходом? Почему он использует так много подключений?
Это приложение не опубликовано, и я единственный пользователь.