Переключение баз данных в Mongo в приложении ExpressJS без повторного подключения каждый раз

avatar
Pshivvy
9 августа 2021 в 04:02
42
0
1

В предисловии хочу сказать, что я искал эту проблему в Интернете и нашел решения с помощью мангуста, я не использую это, поэтому я не знаю, насколько хорошо это переведено здесь. Кроме того, я также использую async/await вместо .then, поэтому мой код отличается.

Мой вопрос заключается в том, что API, который я сделал в ExpressJS, очень медленный по сравнению с тем же API, что и во Flask. Я попытался понять, почему это проблема, поскольку JS должен быть быстрее, чем Python. Я заметил, что это было связано с тем, что я каждый раз подключался к Монго. Мне нужно сделать это, так как моя MongoDB имеет разные базы данных для разных клиентов, поэтому я не могу просто иметь 1 постоянное соединение с одной базой данных. Ниже мой код Mongo.

const {MongoClient} = require('mongodb');
const client = new MongoClient("mongodb+srv://abc@xyz.mongodb.net/<Cluster");

class MongoMethods {
    constructor(company, collection){
        this.company = company;
        this.collection = collection;
    }

    async get(accessParameters){
        try{
            await client.connect();
            const db = client.db(this.company);
            const collection = db.collection(this.collection);
            const val = await collection.findOne({"_id":accessParameters["at"]});
            return val
        } finally {
            await client.close();
        }
    }

   async putIn(putParameters, type){
        try{
            await client.connect();
            const db = client.db(this.company);
            const collection = db.collection(this.collection);
            
            var existing = await collection.findOne({"_id":putParameters["at"]});

            if(type === "array"){
                var toAdd = existing !== undefined && putParameters["in"] in existing? existing[putParameters["in"]] : [];
                toAdd.push(putParameters["value"]);
            }else if(type === "dict"){
                var toAdd = existing !== undefined && putParameters["in"] in existing? existing[putParameters["in"]] : {};
                toAdd[putParameters["key"]] = putParameters["value"];
            }else{
                var toAdd = putParameters["value"];
            }
            
            await collection.updateOne({"_id":putParameters["at"]}, {"$set": {[putParameters["in"]]: toAdd}}, {upsert: true});
        } finally {
            await client.close();
        }
    }

    async remove(removeParameters){
        try{
            await client.connect();
            const db = client.db(this.company);
            const collection = db.collection(this.collection);

            if(removeParameters["key"] !== undefined){
                await collection.updateOne({"_id":removeParameters["at"]}, {"$unset": {[removeParameters["in"] + "." + removeParameters["key"]] : ""}})
            }else if(removeParameters["in"] !== undefined){
                await collection.updateOne({"_id":removeParameters["at"]}, {"$unset": {[removeParameters["in"]] : ""}})
            }else{
                await collection.deleteOne({"_id":removeParameters["at"]})
            }

            
        }finally{
            await client.close();
        }
    }
}

module.exports.MongoMethods = MongoMethods;

Ниже показано, как выглядят функции в моем файле ExpressJS (я не могу опубликовать этот файл, поэтому это отрывок):

var express = require('express');
var cors = require('cors')
const bodyParser = require('body-parser');
const { validate, ValidationError } = require('express-superstruct');
const { MongoMethods } = require('./mongo.js')

let app = express()
app.use(cors())
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.route('/enp1/')
  .get(validate({uid : "string", site : "string"}), function (req, res) {
    var args = req.query
    var mongoClient = new MongoMethods(args.site, "collection_1")
    mongoClient.get({at : args.uid}).catch(console.dir).then(result => {
      if(result == undefined){ // This may need to take into account an empty dict
        res.status(404).json({"Database Error" : "UID does not exists or site is not a valid website"})
      }
      res.status(200).json(result)
    })
  })

app.route('/enp2/')
  .put(validate({site : "string", uid : "string", time : "string"}), function (req, res) {
    var args = req.body;

    var mongoClient = new MongoMethods(args.site, "time")

    mongoClient.putIn({at : args.uid, in : "time", value : parseInt(args.time)}, "int").catch(console.dir).then(result => {
      res.status(200).end()
    })
  })

Похоже, что этот код подключается к Mongo каждый раз, поскольку мне приходится каждый раз инициализировать объект MongoMethods. Могу ли я запретить ему каждый раз пытаться подключиться, чтобы у моего API не было медленных скоростей? Когда я сравниваю скорости, конечные точки JS без Mongo на 50 % быстрее, чем их аналоги Python, но при использовании конечных точек Mongo они примерно на 300 мс медленнее.

Дайте мне знать, если вам нужны дополнительные разъяснения.

Заранее спасибо!

Изменить 1: я хотел отметить, что API работает на AWS API Gateway и функциях AWS Lambda@Edge.

Источник
jifakir
9 августа 2021 в 04:16
0

просмотрите его решение coderhelper для глобального подключения монго . Это может помочь вам.

Pshivvy
9 августа 2021 в 05:50
0

@jifakir Из того, что я вижу по ссылке, все мои функции get, put и т. д. нужно поместить в один файл. Я хочу держать их изолированными, чтобы у меня не было дубликатов. Как я буду работать с этим?

Pshivvy
9 августа 2021 в 06:04
0

Кроме того, похоже, что этот код не будет полезен для нескольких баз данных, так как это мой вариант использования, если только не будет каждый раз изменять значение Connection.db?

Ответы (0)