Маршрут Express / Nodejs не может получить ключи в объекте

Я пытаюсь создать маршрут в node / express, который собирает данные из коллекции mongo db, и у меня возникает очень неприятная проблема. У меня есть коллекция с именем nba_players_v2, и я попытался написать следующий маршрут:

router.get('/shotcharts-v2/player/:player/season/:season', function(req, res) {
    let player_id = req.params.player;
    let season_id = req.params.season;

    console.info('playerid:', player_id, '   seasonid:', season_id);
    db.nba_players_v2.findOne({'_id': player_id}, function(err, player) {
        if (err) res.send(err);
        if (player) {
            console.info('player', player)
            console.info('typeof', typeof(player))
            console.info('keys', Object.keys(player))

            console.info('player firstname', player.firstName)
            let i = 0;
            for (var prop in player) {
                console.info(i, ':  ', prop)
            }
            ... 
        }
    }
}

Я удалил остальную часть GET, которая не важна. Когда я запускаю узел и набираю маршрут в URL-адресе браузера на локальном хосте, я получаю в терминале следующий вывод:

Express server is up and running on 8080 or process.env.PORT!
playerid: 9218    seasonid: 1617
player { _id: '9218',
  firstName: 'Stephen',
  lastName: 'Curry',
  birthDate: '1988-03-14',
  birthCity: 'Akron, OH',
  birthCountry: 'USA',
  highSchool: 'Charlotte Christian',
  college: 'Davidson College',
  officialImageSrc: 'https://ak-static.cms.nba.com/wp-content/uploads/headshots/nba/latest/260x190/201939.png',
  handednessShoots: 'R',
  FullName: 'Curry-Stephen' }
typeof object
keys [ '$__', 'isNew', 'errors', '_doc', '$init' ]
player firstname undefined

1 ': ' '$__'
2 ': ' 'isNew'
3 ': ' 'errors'
4 ': ' '_doc'
5 ': ' '$init'
6 ': ' 'db'
7 ': ' 'discriminators'
8 ': ' '__v'
9 ': ' 'id'
10 ': ' 'schema'
11 ': ' 'collection'
12 ': ' '$__save'
13 ': ' '$__validate'
14 ': ' '$__remove'
15 ': ' '$__init'
16 ': ' '$isMongooseModelPrototype'
17 ': ' '$__handleSave'
18 ': ' 'save'
19 ': ' '$__delta'
20 ': ' '$__version'
21 ': ' 'increment'
22 ': ' '$__where'
23 ': ' 'remove'
24 ': ' 'model'
25 ': ' 'on'
26 ': ' 'once'
27 ': ' 'emit'
28 ': ' 'listeners'
29 ': ' 'removeListener'
30 ': ' 'setMaxListeners'
31 ': ' 'removeAllListeners'
32 ': ' 'addListener'
33 ': ' '$__buildDoc'
34 ': ' 'toBSON'
35 ': ' 'init'
36 ': ' 'update'
37 ': ' '$set'
38 ': ' 'set'
39 ': ' '$__shouldModify'
40 ': ' '$__set'
41 ': ' 'getValue'
42 ': ' 'setValue'
43 ': ' 'get'
44 ': ' '$__path'
45 ': ' 'markModified'
46 ': ' 'unmarkModified'
47 ': ' '$ignore'
48 ': ' 'modifiedPaths'
49 ': ' 'isModified'
50 ': ' '$isDefault'
51 ': ' '$isDeleted'
52 ': ' 'isDirectModified'
53 ': ' 'isInit'
54 ': ' 'isSelected'
55 ': ' 'isDirectSelected'
56 ': ' 'validate'
57 ': ' 'validateSync'
58 ': ' 'invalidate'
59 ': ' '$markValid'
60 ': ' '$isValid'
61 ': ' '$__reset'
62 ': ' '$__dirty'
63 ': ' '$__setSchema'
64 ': ' '$__getArrayPathsToValidate'
65 ': ' '$__getAllSubdocs'
66 ': ' '$__handleReject'
67 ': ' '$toObject'
68 ': ' 'toObject'
69 ': ' 'toJSON'
70 ': ' 'inspect'
71 ': ' 'toString'
72 ': ' 'equals'
73 ': ' 'populate'
74 ': ' 'execPopulate'
75 ': ' 'populated'
76 ': ' 'depopulate'
77 ': ' '$__fullPath'

Очевидно, функция findOne() работает, поскольку console.info(player) распечатывает объект проигрывателя (в данном случае некоторую информацию о Стефе Карри). Однако, когда я пытаюсь ввести имя console.info() (которое это ключ в player), я получаю undefined.

Не особенно важно, что player.firstName возвращает undefined, однако есть и другие ключи, которые также возвращают undefined, которые я использую в остальной части этой функции router.get, которые также возвращают undefined.

Вот скриншот соответствующего объекта (объекта Стефа) внутри коллекции nba_players_v2 в моей базе данных (снимок экрана Robo 3T): Маршрут Express / Nodejs не может получить ключи в объекте

Я не могу заставить мое приложение работать без решения этой проблемы, поэтому, пожалуйста, помогите. Сообщите мне, могу ли я поделиться какой-либо другой информацией (подробнее о console.info()), которая поможет решить эту проблему! Я новичок в веб-разработке, и самостоятельно управлять полным стеком сложно, и подобные ошибки не помогают!

Обновлено: должны ли _ids mongo DB быть уникальными только в одной коллекции или они должны быть уникальными для всей базы данных? не похоже, что проблема, но просто думаю ...

Edit2: должен ли ключ _id в базе данных иметь тип ObjectId, а не тип string? Я вручную создал столбец _id (в R перед вставкой в ​​mongo db с помощью mongolite), и здесь явно указана строка типа.

Проверьте это: for (var prop in player) console.info(prop, ' : ', player[prop]).

Aikon Mogwai 20.10.2018 01:33

отредактирует сообщение с выводом - * он был обновлен

Canovice 20.10.2018 01:35

Я даже не знаю, как отладить это, что является частью хлопот. в полном проигрыше в настоящее время

Canovice 20.10.2018 01:44

я вставил неправильную информацию в console.infos - это огромный вывод, отредактирую под постом

Canovice 20.10.2018 01:47

вывод player[prop] был огромным, но я вставил 77 распечатанных реквизитов - дайте мне знать, будет ли полезно увидеть player[prop] для любого из конкретных реквизитов

Canovice 20.10.2018 01:52

Может плеер array? Попробуйте player[0]

Aikon Mogwai 20.10.2018 01:55

У вас нет игрока, у вас есть объект «Коллекция», в котором есть информация об игроке. Мы не знаем, какую зависимость вы используете для поиска данных, но в ее документации, вероятно, есть информация о том, как получить информацию о плеере. Вероятно, с помощью методов get или getValue, передавая ключ, который вы хотите запросить.

javrd 20.10.2018 02:00
Поведение ключевого слова "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
7
48
3

Ответы 3

Извините, но я не могу добавить это в качестве комментария, потому что у меня нет репутации для этого.

Вы уверены, что этот игрок находится здесь как объект? Мне кажется, что это не разбирающаяся строка json, поэтому ключей нет.

Я обновлю приведенное выше с помощью console.info типа проигрывателя, а также Object.keys

Canovice 20.10.2018 01:46

ПОНЯТНО

В каталоге моделей моего приложения это выглядит как большая часть схем моей коллекции. Это нормально для большинства коллекций, но НЕ для коллекций nba_players_v2 (или других, используемых в файле маршрутов).

Нет, проблема не в схеме, а в концептуальной проблеме с типом объекта, который получает обратный вызов. Смотрите мой последний ответ.

javrd 20.10.2018 02:26

Обновление схемы решило мою проблему. По какой-то причине мне нужно было объявить ключи / типы, которые я использовал в своих маршрутах.

Canovice 20.10.2018 02:33

Поскольку вы используете мангуст, findOne возвращает обратному вызову объект Документ. Если вы хотите иметь firstName, вы должны запросить документ с получать.

player.get('firstName')

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