Значения не определены при попытке экспортировать объект из массива по индексу элемента в Node.js

Изначально у меня внутри файла пустой массив, но во время выполнения кода я получаю данные из базы данных и помещаю данные в массив. Мой код выглядит так:

элементы.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. Я не могу понять, в чем проблема. Я знаю, что могу использовать анонимную функцию при экспорте и получать данные таким образом, но я бы предпочел сделать это, попытавшись получить доступ к данным из массива по индексу элемента. Вся помощь очень ценится!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
491
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я получаю массив с объектом как все

Учитывая этот код, вы не должны. Предположительно, вы звоните 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] } Мне, вероятно, придется использовать геттер, но спасибо в любом случае помог разобраться

Arina S. 22.12.2020 16:44

Другие вопросы по теме