Маршрут Express / Nodejs не может захватить ключи в объекте - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь создать маршрут в узле / экспрессе, который собирает данные из коллекции dong монго, и столкнулся с очень неприятной проблемой.У меня есть коллекция с именем 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.log('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.log('player', player)
            console.log('typeof', typeof(player))
            console.log('keys', Object.keys(player))

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

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

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.log(player)распечатка объекта игрока (в данном случае некоторая информация о Steph Curry).Однако, когда я пытаюсь console.log() имя (которое является ключом в player), я получаю undefined.

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

Вот снимок экрана соответствующего объекта (объекта Steph) внутри коллекции nba_players_v2в моей базе данных (скриншот Robo 3T): enter image description here

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

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

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

Ответы [ 3 ]

0 голосов
/ 20 октября 2018

ПОЛУЧИЛ ЭТО

enter image description here

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

0 голосов
/ 20 октября 2018

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

player.get('firstName')
0 голосов
/ 20 октября 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...