Я пытаюсь создать маршрут в 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):

Я не могу заставить мое приложение работать без решения этой проблемы, поэтому, пожалуйста, помогите. Сообщите мне, могу ли я поделиться какой-либо другой информацией (подробнее о console.info()), которая поможет решить эту проблему! Я новичок в веб-разработке, и самостоятельно управлять полным стеком сложно, и подобные ошибки не помогают!
Обновлено: должны ли _ids mongo DB быть уникальными только в одной коллекции или они должны быть уникальными для всей базы данных? не похоже, что проблема, но просто думаю ...
Edit2: должен ли ключ _id в базе данных иметь тип ObjectId, а не тип string? Я вручную создал столбец _id (в R перед вставкой в mongo db с помощью mongolite), и здесь явно указана строка типа.
отредактирует сообщение с выводом - * он был обновлен
Я даже не знаю, как отладить это, что является частью хлопот. в полном проигрыше в настоящее время
я вставил неправильную информацию в console.infos - это огромный вывод, отредактирую под постом
вывод player[prop] был огромным, но я вставил 77 распечатанных реквизитов - дайте мне знать, будет ли полезно увидеть player[prop] для любого из конкретных реквизитов
Может плеер array? Попробуйте player[0]
У вас нет игрока, у вас есть объект «Коллекция», в котором есть информация об игроке. Мы не знаем, какую зависимость вы используете для поиска данных, но в ее документации, вероятно, есть информация о том, как получить информацию о плеере. Вероятно, с помощью методов get или getValue, передавая ключ, который вы хотите запросить.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Извините, но я не могу добавить это в качестве комментария, потому что у меня нет репутации для этого.
Вы уверены, что этот игрок находится здесь как объект? Мне кажется, что это не разбирающаяся строка json, поэтому ключей нет.
Я обновлю приведенное выше с помощью console.info типа проигрывателя, а также Object.keys
ПОНЯТНО
В каталоге моделей моего приложения это выглядит как большая часть схем моей коллекции. Это нормально для большинства коллекций, но НЕ для коллекций nba_players_v2 (или других, используемых в файле маршрутов).
Нет, проблема не в схеме, а в концептуальной проблеме с типом объекта, который получает обратный вызов. Смотрите мой последний ответ.
Обновление схемы решило мою проблему. По какой-то причине мне нужно было объявить ключи / типы, которые я использовал в своих маршрутах.
Проверьте это:
for (var prop in player) console.info(prop, ' : ', player[prop]).