Объект массива не является итерируемым

У меня есть эта модель в Mongoose и NodeJS:

const VisitorSchema = new Schema({
  visits: [{date: Date, path: String, details: String}],
  // ...
});

И этот код:

// Get all visitors.
VisitorSchema.statics.getAllVisitors = function() {
  try {
    // Return all users.
    return Visitor.find()
      .sort({created: -1})
      .exec();
  } catch (err) {
    console.info(err);
  }
};

// Check and print new users.
VisitorSchema.statics.checkPaths = async function() {
  console.info("Checking paths...");
  let visitors = await this.getAllVisitors();
  for (let visitor of visitors) {
    try {
      for (let v of visitors.visits) {
        // ...
      }
    } catch (e) {
      console.info(e);
      console.info(Object.prototype.toString.call(visitor.visits));
      throw(e);
    }
  }
};

Запуск этой функции неожиданно выдает:

Checking paths...
TypeError: visitors.visits is not iterable
    at Function.VisitorSchema.statics.checkPaths
[object Array]
5efba3a0a97a823909802df5
(node:23663) UnhandledPromiseRejectionWarning: TypeError: visitors.visits is not iterable
    at Function.VisitorSchema.statics.checkPaths 
    at processTicksAndRejections
    ....

Я также проверил объект MongoDB в оболочке mongo, а вложенный документ visits для соответствующего документа представляет собой массив и выглядит нормально:

> db.visitors.findOne({_id: ObjectId("...")})
{
    "_id" : ObjectId("..."),
    "visits" : [
        {
            "_id" : ObjectId("..."),
            "date" : ISODate("..."),
            "path" : "/"
        },
        ...
    ]
}

Как объект Array не может быть итерируемым?

Разве getAllVisitors не следует объявлять асинхронным (VisitorSchema.statics.getAllVisitors = async function() { ... })?

secan 14.12.2020 12:10

Вы ссылаетесь на неправильную переменную во втором внутреннем цикле for. for (let v of visitors.visits) наверное должно быть for (let v of visitor.visits).

Svenskunganka 14.12.2020 12:12

@Sven Вы правы, и это исправлено. Можете ли вы написать ответ, подчеркнув, что все объекты массива итерабельны, а если нет, то ошибка в другом месте?

miguelmorin 14.12.2020 12:17

@EdisonPebojot Можете ли вы сказать больше?

miguelmorin 14.12.2020 12:17

@Sven прав @miguelmorin, однако вы также можете попробовать это visitors.forEach( ( v ) => { console.info(v.visits.id) })

Edison Pebojot 14.12.2020 12:25

@secan Только если ОП имел в виду return await Visitor.find().…;

Bergi 14.12.2020 15:10
Поведение ключевого слова "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) для оценки ваших знаний,...
0
6
1 361
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Массив всегда повторяем в JS. Обратите внимание на строки в коллекции visitors, в которых может отсутствовать свойство visits. Если это свойство не является массивом в MongoDB (это разрешено, поскольку MongoDB является базой данных NoSQL), оно все равно будет приведено к пустому массиву из определения вашей модели.

В вашем конкретном случае у вас опечатка:

for (let v of visitors.visits) // plural

наверное должно быть

for (let v of visitor.visits) // singular

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