Все ваши операции с БД асинхронны, поэтому, когда ваша функция возвращается, эти операции не завершены (и, возможно, даже не запущены).
Это статья , которая прекрасно понимает, как JS обрабатывает асинхронный код.
Также вам может понадобиться понять функции стрелок , чтобы понять код ниже.
Я не знаю, знакомы ли вы с Promise
s, если нет, вот хорошая ссылка .
Теперь я предполагаю, что вы знакомы с асинхронным кодом и обещаниями. Итак, что вам нужно сделать, это:
- подключиться к вашей БД
- получить данные и обработать их
Сначала подключитесь к вашей базе данных (это асинхронная операция):
const mongoose = require( 'mongoose' );
// just call it once to connect to your DB
const connectToMongoDB = uri => new Promise((resolve, reject) => {
mongoose.connect(uri, { useNewUrlParser: true });
const mongooseCo = mongoose.connection;
mongooseCo.on('error', err => reject(err))
mongooseCo.once('open', () => resolve(mongooseCo));
});
Когда это Обещание разрешается, это означает, что ваше соединение с БД открыто (.once('open')
)
Вот как использовать эту функцию:
connectToMongoDB(YOUR_DB_URI)
.then(db => {
/* do what you want with your db */
})
.catch(e => { /* the connection throws an error : e */ })
ОК, теперь вам нужно получить данные из вашей БД и извлечь их. Процесс тот же: создайте функцию, которая возвращает обещание, и разрешите обещание, чтобы получить значение.
const getMyCollections = mongooseCo => new Promise((resolve, reject) => {
mongooseCo.db.listCollections().toArray().then(collections => {
const names = collections.map(col => col.name);
resolve(names);
})
});
Вот как это использовать:
getMyCollections(mongoose.connection)
.then(names => { /* Do what you want with your names */ })
Как заставить это работать вместе
connectToMongoDB(YOUR_DB_URI)
.then(mongooseCo => {
getMyCollections(mongooseCo)
.then(names => {
/* do what you want with your names */
})
})
Лучше использовать Цепочка обещаний :
connectToMongoDB(YOUR_DB_URI)
.then(getMyCollections)
.then(names => {
/* here are your names */
})
Надеюсь, это поможет,
С наилучшими пожеланиями