Изначально у меня внутри файла пустой массив, но во время выполнения кода я получаю данные из базы данных и помещаю данные в массив. Мой код выглядит так:
элементы.js
const items = [];
const init = (connection) => {
return connection.collection('collectionName')
.aggregate([{
....
}])
.toArray()
.then(result => {
items.push(...result);
return result;
});
};
module.exports = {
init,
all: items,
item1: items[0],
item2: roles[1],
};
И когда я пытаюсь импортировать все, item1 и item2, используя require в другом файле, например:
const { all, item1, item2 } = require('../data/items');
Я получаю массив с объектом как все, но получаю неопределенное значение для элемента 1 и элемента 2. Я не могу понять, в чем проблема. Я знаю, что могу использовать анонимную функцию при экспорте и получать данные таким образом, но я бы предпочел сделать это, попытавшись получить доступ к данным из массива по индексу элемента. Вся помощь очень ценится!
Я получаю массив с объектом как все
Учитывая этот код, вы не должны. Предположительно, вы звоните init
в какой-то момент.
но получить undefined для item1 и item 2. Кажется, я не понимаю, в чем проблема.
В то время, когда вы читаете items[0]
, чтобы назначить его экспортируемому объекту, асинхронная функция еще не завершена, поэтому массив все еще остается пустым массивом.
Вы можете заменить item1
на геттер, который получает текущее значение items[0]
в момент, когда вы пытаетесь прочитать свойство item1
, но это, скорее всего, по-прежнему приведет вас к условиям гонки.
Лучшее решение, вероятно, состоит в том, чтобы экспортировать промис, который оценивается как объект после завершения выборки.
Очевидно, вам нужно будет использовать then()
или await
для экспортируемого значения. Вы не получите объект напрямую из import
.
const init = async (connection) => {
const items = await connection.collection('collectionName')
.aggregate([{
....
}])
.toArray()
return {
all: items,
item1: items[0],
item2: roles[1], // whatever roles is
}
};
module.exports = init();
и
const promise = require('../data/items');
const { all, item1, item2 } = await promise;
Я понимаю вашу точку зрения, к сожалению, ваш подход не будет работать так, как мне нужно, потому что, например, когда я импортирую item1, мне нужно использовать его так:
$setOnInsert: { item: item1.name] }
Мне, вероятно, придется использовать геттер, но спасибо в любом случае помог разобраться