#node.js #request
Вопрос:
Я пытаюсь создать приложение, которое находит тесты на kahhot, но когда я запускаю код, данные становятся неопределенными даже за 2 строки, прежде чем я получу эти данные
- Первая консоль.журнал: карточка: { тип: ‘викторина’, заголовок: ‘Угадай, кто’, описание: ‘Начало семестровой викторины, чтобы узнать, насколько хорошо класс знает друг друга’, слаг: ‘угадай, кто’, обложка: ‘https://media.kahoot.it/e6740327-876d-4610-9fba-bc305f4bcae0_opt ‘, coverMetadata: [Объект], draftExists: false, number_of_questions: 38, создатель: ‘bfdca93b-efba-4ccb-a64d-c5538b24ba94’, creator_username: ‘s_swan’, creatorPrimaryUsageType: ‘SCHOOL’, creator_avatar: {}, значки: [], видимость: 1, заблокировано: false, Защита от записи: false, featured: false, молодый_прекрасный: false, спонсируемый: false, черновик: false, комбинированный: false, compatibility_level: 6, sample_questions: [Array], number_of_plays: 110, number_of_players: 274, total_favourites: 0, question_types: [Array], создан: 1471873436135, изменен: 1474121015925, доступ: [Object], duplication_disabled: false, uuid: ‘b58c19b5-b098-4531-a1c6-e8e735e8f7b2’ }
- Вторая консоль.log(): не определено
В цикле «for» данные будут неопределенными, каким образом?
У меня есть этот код:
var options = {
'method': 'GET',
'url': 'https://create.kahoot.it/rest/kahoots/?query=' nam 'amp;cursor=0amp;limit=20amp;topicsamp;grades=amp;orderBy=relevanceamp;searchCluster=1amp;includeExtendedCounters=False',
'headers': {
'Authorization': 'Bearer ' token
}
};
// Starting the request
request(options, function (error, response, body) {
if (error) throw new Error(error);
var data = JSON.parse(body);
var quizzes = data['entities'];
console.log(quizzes);
// Going the all the quzzies we found
for(quiz in quizzes) {
card = quiz['card'];
console.log(card);
}
});```
Ответ №1:
Проблема № 1
Основываясь на вашем первом console.log, похоже, что ваша quizzes
переменная является объектом … а не массивом, поэтому вы не перебираете массив тестов…вы выполняете итерацию по объекту…сначала убедитесь, что ваша quizzes
переменная является массивом.
Проблема № 2
Когда вы используете for...in
оператор, quiz
переменная будет возвращать имя каждого свойства в объекте.
Так что, если я просто консоль.запишите переменную quiz, например:
for(quiz in quizzes) {
console.log(card);
}
Я бы увидел все свойства, зарегистрированные в консоли, следующим образом:
type
title
description
slug
.....
Решение: используйте for...of
оператор
Когда вы используете for...of
оператор, переменная, которую вы устанавливаете ( quiz
в вашем случае), является целым объектом.
Так что, если я просто консоль.запишите переменную quiz, например:
for(const quiz of quizzes) {
console.log(quiz);
}
Я бы увидел это:
card: {
type: 'quiz',
title: 'Viet Nam War',
description: 'Viet Nam War',
slug: 'viet-nam-war',
draftExists: false,
number_of_questions: 37,
creator: '01f63a9f-737b-4f59-b7f5-af10b78ce904',
creator_username: 'Mr.TBrown',
creatorPrimaryUsageType: 'SCHOOL',
creator_avatar: {},
badges: [],
visibility: 1,
locked: false,
writeProtection: false,
last_edit: [Object],
featured: false,
young_featured: false,
sponsored: false,
moderation: [Object],
draft: false,
combined: false,
compatibility_level: 6,
sample_questions: [Array],
number_of_plays: 65,
number_of_players: 169,
total_favourites: 0,
question_types: [Array],
created: 1527781306997,
modified: 1528072275324,
access: [Object],
duplication_disabled: false,
uuid: 'cea8c609-ee88-4f11-b146-e8c70f302f14'
}
Дополнительные примеры см. В следующих документах MDN:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for…in
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for…of
Комментарии:
1. Спасибо @GabrielMC но по какой-то причине это ничего не меняет, это ничего не изменило
2. Извините, я сейчас переписываю свой ответ
3. К, взгляни сейчас. Я попытался лучше объяснить, зачем вам нужно
for...of
Ответ №2:
Если вы хотите выполнить цикл над массивом, который вы обычно хотите использовать for...of
вместо for...in
, а также вам нужно добавить объявление переменной (const или let).
for(const quiz of quizzes) {
card = quiz['card'];
console.log(card);
}
Комментарии:
1. Спасибо @mmoehrlein, это сработало