как использовать функцию connection.db.collection?

Я реализовал следующий код из этой ссылки:

Как лучше всего обрабатывать глобальное соединение MongoDB в NodeJs

создать класс для подключения MongoDB. Но когда я пытаюсь вызвать класс singleton в маршрутизаторе, я получаю следующую ошибку:

TypeError: Connection.db.collection не является функцией

mongodb.js

const MongoClient = require('mongodb').MongoClient
const url = '...';

class Connection {
    static connectToDB() {
        if ( this.database ) return Promise.resolve(this.database)
        return MongoClient.connect(this.url, {useNewUrlParser: true}, (err, db) => {
            if (err) console.log(err);
            else {
                this.db = db;
                console.log('MongoDB connected');
            }
        })
    }
}

Connection.db = null
Connection.url = url
Connection.options = {
    bufferMaxEntries:   0,
    reconnectTries:     5000,
}

module.exports = Connection;

app.js

const express = require('express');
const app = express();
let bodyParser = require('body-parser')

// mongodb config
const Connection = require('../config/mongodb');

const server = app.listen(3000, () => {
    Connection.connectToDB(); // output: MongoDB connected
    console.log(`listening to port: ${port} on http://127.0.0.1:3000}/`); // output: listening to port: 3000 on http://127.0.0.1:3000/
});

router.js

const router = require('express').Router();
let Connection = require('../config/mongodb');

router.post('/data', (req, res) => {
    Connection.db.collection('tweets').find({}) // output: TypeError: Connection.db.collection is not a function
        .then(tweets => console.log(tweets))
        .catch(err => console.log(err));
});

person omaq    schedule 21.10.2018    source источник
comment
Попробуйте один раз в package.json, измените строку mongodb на mongodb: ^ 2.2.33. Вам нужно будет удалить npm mongodb; затем npm install для установки этой версии.   -  person Jitendra    schedule 21.10.2018
comment
Спасибо! Оно работает   -  person omaq    schedule 21.10.2018


Ответы (2)


Попробуйте один раз в package.json, измените строку mongodb на «mongodb»: «^ 2.2.33». Вам нужно будет удалить npm mongodb; затем npm install для установки этой версии.

person Jitendra    schedule 22.10.2018

Вопрос, который вы связали, использует обещания повсюду, тогда как вы используете версию обратного вызова connect.

return MongoClient.connect(this.url, {useNewUrlParser: true}, (err, db) => ...

Затем вы вызываете это, не возвращаясь на свой сервер:

Connection.connectToDB();
console.log(`listening to port: ${port} on http://127.0.0.1:3000}/`);

Поэтому нет гарантии, что ваше соединение будет установлено к моменту поступления вашего первого запроса к API. На самом деле, если бы вы это сделали:

Connection.connectToDB();
console.log(`listening to port: ${port} on http://127.0.0.1:3000}/`);
Connection.db.collection('tweets').find({});

Это будет терпеть неудачу каждый раз, поскольку Connection.db по-прежнему будет нулевым.

В приведенном вами примере использование промисов защищает от этого. Обратите особое внимание на метод подключения:

static connectToDB() {
    if ( this.database ) return Promise.resolve(this.database)
    // ** USING THE PROMISE VERSION OF CONNECT **
    return MongoClient.connect(this.url, this.options)
        .then(db => this.db = db)
}

и ваш код использования также должен использовать обещания:

return Connection.connectToDB()
    .then(() => {
        // do something here
    });
person sofcal    schedule 21.10.2018