So verwenden Sie die Verbindung zu Mongodb über NodeJs Anwendungen und Module hinweg ordnungsgemäß wieder

123

Ich habe gelesen und gelesen und bin immer noch verwirrt darüber, wie ich dieselbe Datenbankverbindung (MongoDb) am besten für die gesamte NodeJs-App freigeben kann. Soweit ich weiß, sollte die Verbindung offen sein, wenn die App gestartet und zwischen Modulen wiederverwendet wird. Meine derzeitige Idee des besten Weges ist, dass server.js(Hauptdatei, in der alles beginnt) eine Verbindung zur Datenbank hergestellt und eine Objektvariable erstellt wird, die an Module übergeben wird. Sobald die Verbindung hergestellt ist, wird diese Variable nach Bedarf vom Modulcode verwendet, und diese Verbindung bleibt offen. Z.B:

    var MongoClient = require('mongodb').MongoClient;
    var mongo = {}; // this is passed to modules and code

    MongoClient.connect("mongodb://localhost:27017/marankings", function(err, db) {
        if (!err) {
            console.log("We are connected");

            // these tables will be passed to modules as part of mongo object
            mongo.dbUsers = db.collection("users");
            mongo.dbDisciplines = db.collection("disciplines");

            console.log("aaa " + users.getAll()); // displays object and this can be used from inside modules

        } else
            console.log(err);
    });

    var users = new(require("./models/user"))(app, mongo);
    console.log("bbb " + users.getAll()); // not connected at the very first time so displays undefined

dann models/usersieht ein anderes Modul so aus:

Users = function(app, mongo) {

Users.prototype.addUser = function() {
    console.log("add user");
}

Users.prototype.getAll = function() {

    return "all users " + mongo.dbUsers;

    }
}

module.exports = Users;

Jetzt habe ich das schreckliche Gefühl, dass dies falsch ist. Gibt es also offensichtliche Probleme mit diesem Ansatz und wenn ja, wie kann ich ihn verbessern?

Spirytus
quelle
Die gleiche Frage, die ich vor ein paar Tagen gestellt habe. stackoverflow.com/questions/24547357/…
Salvador Dali
Überprüfen Sie den mongoistischen Fahrer. Es ist " mit Blick auf Async / Warten gebaut " und ermöglicht träge Exportverbindungen wie module.exports = mongoist(connectionString);. (Lesen Sie mehr darüber connectionStringim MongoDB-Handbuch.)
Alexandr Nil

Antworten:

149

Sie können ein mongoUtil.jsModul erstellen , das Funktionen zum Herstellen einer Verbindung mit Mongo und zum Zurückgeben einer Mongo-Datenbankinstanz enthält:

const MongoClient = require( 'mongodb' ).MongoClient;
const url = "mongodb://localhost:27017";

var _db;

module.exports = {

  connectToServer: function( callback ) {
    MongoClient.connect( url,  { useNewUrlParser: true }, function( err, client ) {
      _db  = client.db('test_db');
      return callback( err );
    } );
  },

  getDb: function() {
    return _db;
  }
};

Um es zu verwenden, würden Sie dies in Ihrem tun app.js:

var mongoUtil = require( 'mongoUtil' );

mongoUtil.connectToServer( function( err, client ) {
  if (err) console.log(err);
  // start the rest of your app here
} );

Und wenn Sie dann wie in einer anderen .jsDatei Zugriff auf Mongo an einem anderen Ort benötigen , können Sie dies tun:

var mongoUtil = require( 'mongoUtil' );
var db = mongoUtil.getDb();

db.collection( 'users' ).find();

Der Grund, warum dies funktioniert, ist, dass Module im Knoten requirenur einmal geladen / bezogen werden, sodass Sie immer nur eine Instanz von erhalten _dbund mongoUtil.getDb()immer dieselbe Instanz zurückgeben.

Hinweis: Code nicht getestet.

go-oleg
quelle
6
Tolles Beispiel! Ich habe jedoch eine Frage. Wie würde dies funktionieren, wenn Sie Ihre App mit mehreren Clustern ausführen? Würde es eine andere Instanz der Verbindung hochfahren oder einfach die vorhandene Verbindung von der Quelle verwenden?
Farhan Ahmad
18
Wie würden Sie mit dem Fall umgehen, wenn die Mongo-Verbindung dazwischen stirbt? Alle Aufrufe von getDb () schlagen in diesem Szenario fehl, bis die Knotenanwendung neu gestartet wird.
Ayan
4
Ich habe diesen Code ausprobiert, aber bei mongoUtil.getDb () wurde null. Ich weiß nicht, warum das so ist.
Keming
3
@KemingZeng - Sie müssen sicherstellen, dass alle Module, die mongoUtil verwenden, in app.jsdie Rückruffunktion von importiert werden connectToServer. Wenn Sie requiresie app.jszuvor _dbfestgelegt haben, werden in den anderen Modulen undefinierte Fehler angezeigt.
Mike R
2
Ab mongoDB Version 4 sollte es sein var database = mongoUtil.getDb(); database.db().collection( 'users' ).
Julian Veerkamp
26

Es gibt viele Möglichkeiten, dies zu optimieren, um Konfigurationsobjekte an bestimmten Stellen zu akzeptieren. Insgesamt ähnelt es jedoch der Anordnung Ihres Codes, wenn auch mit modernerer JS-Syntax. Könnte leicht in Prototypen und Rückrufe umgeschrieben werden, wenn dies Ihre Anforderung ist.

mongo.js

const { MongoClient } = require('mongodb');
const config = require('./config');
const Users = require('./Users');
const conf = config.get('mongodb');

class MongoBot {
  constructor() {
    const url = `mongodb://${conf.hosts.join(',')}`;

    this.client = new MongoClient(url, conf.opts);
  }
  async init() {
    await this.client.connect();
    console.log('connected');

    this.db = this.client.db(conf.db);
    this.Users = new Users(this.db);
  }
}

module.exports = new MongoBot();

Users.js

class User {
  constructor(db) {
    this.collection = db.collection('users');
  }
  async addUser(user) {
    const newUser = await this.collection.insertOne(user);
    return newUser;
  }
}
module.exports = User;

app.js.

const mongo = require('./mongo');

async function start() {
  // other app startup stuff...
  await mongo.init();
  // other app startup stuff...
}
start();

someFile.js

const { Users } = require('./mongo');

async function someFunction(userInfo) {
  const user = await Users.addUser(userInfo);
  return user;
}
EddieDean
quelle
Dies ist der sauberste Ansatz, den ich je gesehen habe
KalenGi
Mir ist klar, dass diese Antwort fast ein Jahr alt ist und ich nicht wirklich mehr Informationen erwarte, aber dies scheint der Ansatz zu sein, den ich am liebsten verwenden würde, aber ich habe kein Glück, das zerstörte Benutzerobjekt aus der Mongo-Datei zu ziehen. Ich habe eine Datei, die Ihrer someFile.js sehr ähnlich ist, aber Zeile 4, in der Sie Users.addUser aufrufen, wird für mich immer in die Luft gesprengt - sagt, dass Users undefiniert ist. Gibt es ein offensichtliches Stück, das mir fehlt?
Rob E.
Am Ende habe ich eine neue Frage gestellt, weil mich das so nervt.
Rob E.
Das sollte technisch nicht funktionieren. Require speichert das Objekt beim ersten Aufruf zwischen. In diesem Fall wird nur das vom Konstruktor zurückgegebene Objekt zwischengespeichert. Ein späterer Aufruf von 'init' hat keine Auswirkung auf die Rückgabe. Daher sollte diese const {Users} = require ('./ mongo') fehlschlagen, da das zwischengespeicherte Ergebnis keine 'User'-Eigenschaft enthält.
beNerd
require.cache speichert einen Verweis auf das Objekt, der von allen Dateien gemeinsam genutzt wird, die dieses Objekt benötigen. Objekte, die durch Aktionen aus anderen Teilen des Programms (oder sogar selbst, wenn Sie Timer verwenden) mutiert werden können. Sie können es schnell selbst testen, aber ich habe einen kurzen Stift zusammengeschmissen, um die Demo zu testen
EddieDean
19

Hier ist, wie ich es mit zeitgenössischer Syntax mache, basierend auf dem Beispiel von go-oleg. Meins ist getestet und funktionsfähig.

Ich habe einige Kommentare in den Code eingefügt.

./db/mongodb.js

 const MongoClient = require('mongodb').MongoClient
 const uri = 'mongodb://user:password@localhost:27017/dbName'
 let _db

 const connectDB = async (callback) => {
     try {
         MongoClient.connect(uri, (err, db) => {
             _db = db
             return callback(err)
         })
     } catch (e) {
         throw e
     }
 }

 const getDB = () => _db

 const disconnectDB = () => _db.close()

 module.exports = { connectDB, getDB, disconnectDB }

./index.js

 // Load MongoDB utils
 const MongoDB = require('./db/mongodb')
 // Load queries & mutations
 const Users = require('./users')

 // Improve debugging
 process.on('unhandledRejection', (reason, p) => {
     console.log('Unhandled Rejection at:', p, 'reason:', reason)
 })

 const seedUser = {
     name: 'Bob Alice',
     email: '[email protected]',
     bonusSetting: true
 }

 // Connect to MongoDB and put server instantiation code inside
 // because we start the connection first
 MongoDB.connectDB(async (err) => {
     if (err) throw err
     // Load db & collections
     const db = MongoDB.getDB()
     const users = db.collection('users')

     try {
         // Run some sample operations
         // and pass users collection into models
         const newUser = await Users.createUser(users, seedUser)
         const listUsers = await Users.getUsers(users)
         const findUser = await Users.findUserById(users, newUser._id)

         console.log('CREATE USER')
         console.log(newUser)
         console.log('GET ALL USERS')
         console.log(listUsers)
         console.log('FIND USER')
         console.log(findUser)
     } catch (e) {
         throw e
     }

     const desired = true
     if (desired) {
         // Use disconnectDB for clean driver disconnect
         MongoDB.disconnectDB()
         process.exit(0)
     }
     // Server code anywhere above here inside connectDB()
 })

./users/index.js

 const ObjectID = require('mongodb').ObjectID

 // Notice how the users collection is passed into the models
 const createUser = async (users, user) => {
     try {
         const results = await users.insertOne(user)
         return results.ops[0]
     } catch (e) {
         throw e
     }
 }

 const getUsers = async (users) => {
     try {
         const results = await users.find().toArray()
         return results
     } catch (e) {
         throw e
     }
 }

 const findUserById = async (users, id) => {
     try {
         if (!ObjectID.isValid(id)) throw 'Invalid MongoDB ID.'
         const results = await users.findOne(ObjectID(id))
         return results
     } catch (e) {
         throw e
     }
 }

 // Export garbage as methods on the Users object
 module.exports = { createUser, getUsers, findUserById }
agm1984
quelle
Ist der Try Catch in Ihrem ersten Snippet notwendig? Die Verbindungsfunktion ist eine asynchrone Funktion. Der Fehler wird bereits mithilfe des Rückrufs im Knotenstil abgefangen.
Shanks
1
Es ist eine sehr aufmerksame Frage, die ich liebe. Ich bin mir nicht sicher, ohne es genauer in dem Lebensraum zu studieren, in dem Sie den Code platzieren. Es wird eine begrenzte Anzahl von Pfaden geben, die während der Codeausführung verwendet werden können. Ich habe es hauptsächlich hinzugefügt, um zu zeigen, dass Sie dort einen benutzerdefinierten Handler platzieren können, und weil ich standardmäßig try / catch in asynchrone Funktionen einbeziehe. Es ist einfach ein Haken. Gute Frage. Ich werde aktualisieren, wenn Sie einen zusätzlichen Hinweis finden.
agm1984
Jedes Mal, wenn ich getDB () aufrufe, werden neue Verbindungen erstellt, oder?
Vinay Pandya
18

Wenn Sie Express verwenden, können Sie das Express-Mongo-DB- Modul verwenden, mit dem Sie eine Datenbankverbindung im Anforderungsobjekt herstellen können.

Installieren

npm install --save express-mongo-db

server.js

var app = require('express')();

var expressMongoDb = require('express-mongo-db');
app.use(expressMongoDb('mongodb://localhost/test'));

routen / users.js

app.get('/', function (req, res, next) {
    req.db // => Db object
});
Mukesh Chapagain
quelle
8

go-oleg ist im Grunde richtig, aber in diesen Tagen möchten Sie (wahrscheinlich) nicht "mongodb" selbst verwenden, sondern ein Framework verwenden, das viel "schmutzige Arbeit" für Sie erledigt.

Zum Beispiel ist Mungo einer der häufigsten. Dies ist, was wir in unserer ursprünglichen server.jsDatei haben:

const mongoose = require('mongoose');
const options = {server: {socketOptions: {keepAlive: 1}}};
mongoose.connect(config.db, options);

Dies ist alles, was zum Einrichten erforderlich ist. Verwenden Sie dies jetzt an einer beliebigen Stelle in Ihrem Code

const mongoose = require('mongoose');

Und Sie erhalten die Instanz, mit der Sie eingerichtet haben mongoose.connect

libik
quelle
1
Mungo ist ein ORM. Lesen Sie dies , um mögliche Fallstricke zu erfahren. Zweifellos eignen sich ORMs hervorragend für Entwicklungs- und Lernprozesse, jedoch nicht für die Produktion. Denken Sie daran
Saras Arya
1
Mungo erfordert auch Schemata. Ich verwende das MongoDB-Paket als Teil der Polyglot-Persistenz mit Neo4j, daher ist es hilfreich, Dokumenteigenschaften nach Bedarf zu definieren.
agm1984
7

Initialisieren Sie die Verbindung als Versprechen:

const MongoClient = require('mongodb').MongoClient
const uri = 'mongodb://...'
const client = new MongoClient(uri)
const connection = client.connect() // initialized connection

Rufen Sie dann die Verbindung auf, wann immer Sie eine Aktion für die Datenbank ausführen möchten:

    // if I want to insert into the database...
    const connect = connection
    connect.then(() => {
        const doc = { id: 3 }
        const db = client.db('database_name')
        const coll = db.collection('collection_name')
        coll.insertOne(doc, (err, result) => {
            if(err) throw err
        })
    })
Henry Bothin
quelle
7

Eine getestete Lösung basierend auf der akzeptierten Antwort:

mongodbutil.js:

var MongoClient = require( 'mongodb' ).MongoClient;
var _db;
module.exports = {
  connectToServer: function( callback ) {
    MongoClient.connect( "<connection string>", function( err, client ) {
      _db = client.db("<collection name>");
      return callback( err );
    } );
  },
  getDb: function() {
    return _db;
  }
};

app.js:

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var app = express();
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

var mongodbutil = require( './mongodbutil' );
mongodbutil.connectToServer( function( err ) {
  //app goes online once this callback occurs
  var indexRouter = require('./routes/index');
  var usersRouter = require('./routes/users');
  var companiesRouter = require('./routes/companies');
  var activitiesRouter = require('./routes/activities');
  var registerRouter = require('./routes/register');  
  app.use('/', indexRouter);
  app.use('/users', usersRouter);
  app.use('/companies', companiesRouter);
  app.use('/activities', activitiesRouter);
  app.use('/register', registerRouter);  
  // catch 404 and forward to error handler
  app.use(function(req, res, next) {
    next(createError(404));
  });
  // error handler
  app.use(function(err, req, res, next) {
    res.locals.message = err.message;
    res.locals.error = req.app.get('env') === 'development' ? err : {};
    res.status(err.status || 500);
    res.render('error');
  });
  //end of calback
});

module.exports = app;

activity.js - eine Route:

var express = require('express');
var router = express.Router();
var mongodbutil = require( '../mongodbutil' );
var db = mongodbutil.getDb();

router.get('/', (req, res, next) => {  
    db.collection('activities').find().toArray((err, results) => {
        if (err) return console.log(err)
            res.render('activities', {activities: results, title: "Activities"})
    });
});

router.post('/', (req, res) => {
  db.collection('activities').save(req.body, (err, result) => {
    if (err) return console.log(err)
    res.redirect('/activities')
  })
});

module.exports = router;
Steve
quelle
Diese Antwort ist vollständig und funktional.
Ahmad Sharif
6

Hier ist mein Setup im Jahr 2020:

./utils/database.js

const { MongoClient } = require('mongodb');

class Mongo {
    constructor () {
        this.client = new MongoClient("mongodb://127.0.0.1:27017/my-app", {
            useNewUrlParser: true,
            useUnifiedTopology: true
        });
    }

    async main () {
        await this.client.connect();
        console.log('Connected to MongoDB');

        this.db = this.client.db();
    }
}

module.exports = new Mongo();

/app.js

const mongo = require('./utils/database');
const express = require('express');

const app = express();

const boot = async () => {
    await mongo.main();
    app.listen(3000);
};

boot();
Aditya Hajare
quelle
3

Wir können eine dbconnection-Datei wie dbconnection.js erstellen

const MongoClient = require('mongodb').MongoClient
const mongo_url = process.env.MONGO_URL;

    module.exports = {
        connect: async function(callback) {
            var connection;
            await new Promise((resolve, reject) => {
                MongoClient.connect(mongo_url, {
                    useNewUrlParser: true
                }, (err, database) => {
                    if (err)
                        reject();
                    else {
                        connection = database;
                        resolve();
                    }
                });
            });
            return connection;
        }

    };

und dann benutze diese Datei in deiner App wie

var connection = require('../dbconnection');

und dann wie folgt in Ihrer Async-Funktion verwenden

db  = await connection.connect();

hoffe das wird klappen

gaurav
quelle
2

Ich bin etwas spät dran, aber ich werde auch meine Lösung hinzufügen. Es ist ein viel noobier Ansatz im Vergleich zu den Antworten hier.

Wenn Sie MongoDB Version 4.0 und Node.js 3.0 (oder höhere Versionen) verwenden, können Sie die isConnected()Funktion von verwenden MongoClient.

const MongoClient = require('mongodb').MongoClient;
const uri = "<your connection url>";
const client = new MongoClient(uri, { useNewUrlParser: true });

if (client.isConnected()) {
  execute();
} else {
  client.connect().then(function () {
    execute();
  });
}

function execute() {
    // Do anything here
    // Ex: client.db("mydb").collection("mycol");
}

Das hat bei mir gut funktioniert. Ich hoffe es hilft.

Roshana Pitigala
quelle
2

Ich bin zu spät zur Party, aber hoffentlich hilft diese Antwort jemandem. Dies ist ein Funktionscode:

db.js

const MongoClient = require("mongodb").MongoClient
const urlMongo = "mongodb://localhost:27017"

var db;

function connectToServer( callback ) {
    MongoClient.connect(urlMongo,  { useUnifiedTopology: true , useNewUrlParser: true }, function( err, client ) {
        db  = client.db('auth');
        return callback( err );
    })
}

function getDb() {
    return db
}

module.exports = {connectToServer, getDb}

Wir exportieren eine Funktion, um eine Verbindung zum Mongo herzustellen, und eine andere, um die Instanz der Verbindung zu erhalten.

app.js.

const express = require('express')
const app = express()

const mongo = require('./db.js');

mongo.connectToServer( function( err) {
  if (err) console.log(err);
  const auth = require('./modulos')

  app.post('/login', (req, res) => { auth.login(req, res)})
  app.listen(3000, function () { console.log('Corriendo en puerto 3000')})

});

Wir müssen die Anforderungen des Auth-Moduls erfüllen, nachdem wir die Verbindung initiiert haben, andernfalls gibt die Funktion getDb undefined zurück.

module.js

const db = require('../db.js').getDb()
const usuariosCollection = db.collection('usuarios')

function login(req, res){
    usuariosCollection.find({ 'username': 'Fran' }).toArray(function (err, doc) {
        ...
    })
}
Knemay
quelle
2

Da dies mit Express gekennzeichnet ist, dachte ich, ich würde erwähnen, dass Express eine integrierte Funktion zum Teilen von Daten zwischen Routen hat. Es gibt ein Objekt namens app.locals. Wir können ihm Eigenschaften hinzufügen und von unseren Routen aus darauf zugreifen. Sie instanziieren einfach Ihre Mongo-Verbindung in Ihrer app.js-Datei.

var app = express();

MongoClient.connect('mongodb://localhost:27017/')
.then(client =>{
  const db = client.db('your-db');
  const collection = db.collection('your-collection');
  app.locals.collection = collection;
});
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              // view engine setup
app.set('views', path.join(__dirname, 'views'));

Auf diese Datenbankverbindung kann jetzt innerhalb Ihrer Routen wie unten beschrieben zugegriffen werden, ohne dass zusätzliche Module erstellt und benötigt werden müssen.

app.get('/', (req, res) => {
  const collection = req.app.locals.collection;
  collection.find({}).toArray()
  .then(response => res.status(200).json(response))
  .catch(error => console.error(error));
});

Diese Methode stellt sicher, dass für die Dauer Ihrer App eine Datenbankverbindung geöffnet ist, es sei denn, Sie möchten sie jederzeit schließen. Es ist leicht zugänglich req.app.locals.your-collectionund erfordert keine zusätzlichen Module.

Hoppo
quelle
Ich finde es der sauberste Ansatz. Haben wir mögliche Nachteile für diesen Ansatz? Ich benutze es und sehe für mich ziemlich gut aus, würde meine Erkenntnisse teilen.
Priya Ranjan Singh
@PriyaRanjanSingh Um ehrlich zu sein, kenne ich keine Nachteile, aber ich bin kein Experte in diesem Bereich. Ich entdeckte diese Methode nach Recherchen, da ich die anderen Methoden unfreundlich fand und nach saubererem, verständlicherem Code zu meinem eigenen Vorteil suchte. Hoffentlich kann jemand, der besser informiert ist als ich, hervorheben, ob es irgendwelche Nachteile gibt. Ich benutze diese Methode jedoch schon seit einiger Zeit ohne Probleme und sie scheint gut zu funktionieren.
Hoppo
1

Wenn Sie sich für die Verwendung von Mungo in Ihrer Anwendung entscheiden, bearbeiten Sie Ihre Datei app.js mit dem folgenden Snippet

app.js.

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/Your_Data_Base_Name', {useNewUrlParser:true})
  .then((res) => {
    console.log(' ########### Connected to mongDB ###########');
  })
  .catch((err) => {
    console.log('Error in connecting to mongoDb' + err);
  });`

Nächster Schritt: Definieren Sie Modelle für Ihre Anwendung, die Sie benötigen, und führen Sie die CRUD-Operation beispielsweise direkt aus

blogSchema.js

 const mongoose = require('mongoose');
 const Schema = mongoose.Schema;
 const blogSchema = new Schema({
     _id : mongoose.Schema.Types.ObjectId,
     title : {
        type : 'String',
        unique : true,
        required : true       
    },
    description : String,
        comments : [{type : mongoose.Schema.Types.ObjectId, ref: 'Comment'}]
 });
 module.exports = mongoose.model('Blog', blogSchema);

Verwendung createBlog.js

const Blog = require('../models/blogSchema');
exports.createBlog = (req, res, next) => {
const blog = new Blog({
  _id : new mongoose.Types.ObjectId,
  title : req.body.title,
  description : req.body.description,
});
blog.save((err, blog) => {
  if(err){
    console.log('Server Error save fun failed');
    res.status(500).json({
      msg : "Error occured on server side",
      err : err
    })
  }else{
    //do something....
  }

Sie müssen nicht immer eine Verbindung zu mogoDB herstellen ....

Naresh_Varma
quelle
1
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/';
var Pro1;

module.exports = {
    DBConnection:async function()
    {
        Pro1 = new Promise(async function(resolve,reject){
            MongoClient.connect(url, { useNewUrlParser: true },function(err, db) {
                if (err) throw err;
                resolve(db);
            });        
        });
    },
    getDB:async function(Blockchain , Context)
    {
        bc = Blockchain;
        contx = Context;
        Pro1.then(function(_db)
        {
            var dbo = _db.db('dbname');
            dbo.collection('collectionname').find().limit(1).skip(0).toArray(function(err,result) {
                if (err) throw err;
                console.log(result);
            });
        });
    },
    closeDB:async function()
    {
        Pro1.then(function(_db){
            _db.close();
        });
    }
};
Tejas Naik
quelle
1
Können Sie bitte eine kurze Beschreibung hinzufügen?
RtmY
1
const express = require('express')
const server = express()
const mongoClient = require('./MongoDB.js').client
const port = 3000
;(async () => {
    await mongoClient.connect()
    server.listen(port, () => console.log(`Server is listening on port ${port}!`))
})().catch(console.error)
Xulong Zhang
quelle
0

Ich finde das funktioniert gut :)

mongoUtil.ts

import { MongoClient } from 'mongodb';
const uri =
  'MONGOSTRING';

let connPoolPromise: any = null;

const mongoPoolPromise = () => {
  if (connPoolPromise) return connPoolPromise;

  connPoolPromise = new Promise((resolve, reject) => {
    const conn = new MongoClient(uri, {
      useNewUrlParser: true,
      useUnifiedTopology: true,
    });

    if (conn.isConnected()) {
      return resolve(conn);
    } else {
      conn
        .connect()
        .then(() => {
          return resolve(conn.db('DATABASENAME'));
        })
        .catch(err => {
          console.log(err);
          reject(err);
        });
    }
  });

  return connPoolPromise;
};

export = {
  mongoPoolPromise,
};

anyFile.ts

const { mongoPoolPromise } = require('./mongoUtil');

async function getProducts() {
  const db = await mongoPoolPromise();
  const data = await db
    .collection('myCollection')
    .find({})
    .toArray();
  console.log(data);
  return data;
}

export { getProducts };
Adam91Holt
quelle
Die Antwort ist mit markiert. javascriptEine TypeScript-Antwort ist nicht angemessen.
KPopOG