У меня есть функция, которая подключается к базе данных Mongo, а затем находит в базе данных документы, соответствующие массиву.
Функция на самом деле работает нормально, и нужные мне данные находятся и возвращаются функцией checkIfExist(). Однако функция возвращает ошибку в консоли, несмотря на то, что она работает. Ошибка «MongoError: невозможно использовать сеанс, который завершился», как показано ниже.
Я не понимаю, что я делаю неправильно здесь.
Ошибка:
Функция:
async function main() {
const uri = 'URL';
const client = new MongoClient(uri, { useUnifiedTopology: true });
const pairData = [`_EURAUD_data`, `_EURCAD_data`, `_EURCHF_data`];
await client.connect();
const db = client.db('daily-ohlc').collection('ohlcs');
try {
const checkIfExist = async () => {
pairData.map(pair => {
const findstuff = db.find({ _id: pair._id }).toArray();
console.info(`${findstuff}`);
});
};
await checkIfExist();
} catch (e) {
console.error(e);
} finally {
console.info(`closing timne`);
await client.close();
}
}
main().catch(console.error);
Вещи, которые я пробовал.
Решение было простым: обернуть Array.map в метод Promise.all. Когда я сделал это, Array.map завершился, прежде чем перейти к блоку finally.
async function main() {
const uri = 'URL';
const client = new MongoClient(uri, { useUnifiedTopology: true });
try {
await client.connect();
const pairData = await cleanObject();
const db = client.db('daily-ohlc').collection('ohlcs');
const updateOrCreate = async () =>
//needs to be in a promise
Promise.all(
pairData.map(async pair => {
const check = db
.find({ _id: pair._id, 'data.date': pair.data[0].date })
.toArray()
.then(value => value.length === 0);
if (check) {
return db
.updateOne({ _id: pair._id, 'data.date': pair.data[0].date }, { $set: { 'data.$': pair.data[0] } }, { upsert: true })
.then(result => `UPDATED DAY: ${pair._id}`)
.catch(er => console.info(er));
}
return db
.updateOne({ _id: pair._id }, { $push: { data: { $each: [pair.data[0]], $position: 0 } } }, { upsert: true })
.then(result => `ADDED DAY: ${pair._id}`)
.catch(er => console.info(er));
})
);
console.info(await updateOrCreate());
await updateOrCreate();
} catch (e) {
console.error(e);
} finally {
console.info(`sever connection closing...`);
await client.close();
}
}
main().catch(error => console.info(error));
return pairData.map... вы не возвращаете значение из функции карты, и вам не нужно размещать ожидание сразу за блоком try. Затем, когда вы вызываете main(), используйте then для регистрации объекта разрешения, если обещание возвращается, а затем вы можете использовать catch для регистрации ошибки, если обещание отклонено.