не удалось создать соединение mongodb в nodejs 8 - PullRequest
0 голосов
/ 26 июня 2018

Nodejs: v8.11.3 - mongo: v3.6.3

следующий учебник http://mongodb.github.io/node-mongodb-native/3.0/tutorials/crud/

app.js

const mongoDB = require('./common_mongo.js')
mongoDB.initMongo()

common_mongo.js

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

let getDb;
const initMongo = async () => {
    const client = await MongoClient.connect(url);
    getDb = await client.db(dbName);
    await getDb.collection('comments').insert({text: 'hello'});
    //WORKS
};

module.exports = {
    initMongo,
    getDb,
};

user.js

const mongoDB = require('./common_mongo.js');

app.get('/users', async (req, res) => {     
    let list  = await mongoDB.getDb.collection('user').find({})
    //FAILS
    res.send(list);
})

TypeError: Невозможно прочитать свойство 'collection' из неопределенного в user.js

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

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Вы объявили initMongo как асинхронную функцию. Когда вы вызываете initMongo, он просто возвращает обещание, и выполнение программы продолжается. В этом случае getDb еще не инициализирован. Вы можете подождать, пока обещание не будет выполнено или не произойдет ошибка:

mongoDB.initMongo().then(function () {
    // connection succeeded. Do the stuff from user.js
}).catch(function (err) {
     //failure callback. Doing the stuff from user.js won't make any sense here.
});
0 голосов
/ 26 июня 2018

У вас есть user.js, загруженный до того, как initMongo действительно произойдет. Таким образом, mongoDB будет содержать неопределенное значение для переменной getDb.

Самый простой из возможных способов рефакторинга - просто изменить getDb с переменной на функцию, чтобы ваш код выглядел примерно так:

common_mongo.js

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

let db;
const initMongo = async () => {
    const client = await MongoClient.connect(url);
    db = await client.db(dbName);
    await db.collection('comments').insert({text: 'hello'});
};

module.exports = {
    initMongo,
    getDb() {
      return db;
    },
};

user.js

const mongoDB = require('./common_mongo.js');    

app.get('/users', async (req, res) => {     
    let list  = await mongoDB.getDb().collection('user').find({})
    res.send(list);
})

еще дальше вы можете определить геттер вместо getDb

module.exports = {
    initMongo,
    get db() {
      return db;
    },
};

app.get('/users', async (req, res) => {     
    let list  = await mongoDB.db.collection('user').find({})
    res.send(list);
})
0 голосов
/ 26 июня 2018

Вам необходимо выполнить инициализацию перед использованием getDb, следующий код может помочь вам

const mongoDB = require('./common_mongo.js');

app.get('/users', async (req, res) => {   
    if (!mongoDB.getDb) {  //Check getDb initialise or not
        await mongoDB.initMongo();
    }
    let list  = await mongoDB.getDb.collection('user').find({})
    //FAILS
    res.send(list);
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...