Mongoose + Node.js, Object.assign (копия данных, возвращаемых из базы данных) показывает дополнительные данные - PullRequest
0 голосов
/ 25 июня 2018

Сегодня я обнаружил интересную вещь, которую никогда раньше не знал. Мне нужна помощь в понимании того, почему это произошло:

User.findOne({email: req.body.email}, function(err, usr){
     return res.json({
          RAW: usr,
          COPY: Object.assign({}, usr, {some: 'change'})
     }) 
})

этот урожай

{
    "RAW": {
        "createdAt": "2018-06-25T09:16:35.516Z",
        "_id": "5b30b2f36c492c55a818b455",
        "email": "some@email.com",
        "password": "$2b$08$k5IRBF.1i.q.7D/BD4HCVuOdnIRDQOHaT6icNwIyc1XfeklUwyF5.",
        "__v": 0
    },
    "COPY": {
        "$__": {
            "strictMode": true,
            "selected": {},
            "getters": {},
            "_id": "5b30b2f36c492c55a818b455",
            "wasPopulated": false,
            "activePaths": {
                "paths": {
                    "createdAt": "init",
                    "_id": "init",
                    "email": "init",
                    "password": "init",
                    "__v": "init"
                },
                "states": {
                    "ignore": {},
                    "default": {},
                    "init": {
                        "_id": true,
                        "email": true,
                        "password": true,
                        "createdAt": true,
                        "__v": true
                    },
                    "modify": {},
                    "require": {}
                },
                "stateNames": [
                    "require",
                    "modify",
                    "init",
                    "default",
                    "ignore"
                ]
            },
            "pathsToScopes": {},
            "emitter": {
                "domain": null,
                "_events": {},
                "_eventsCount": 0,
                "_maxListeners": 0
            },
            "$options": true
        },
        "isNew": false,
        "_doc": {
            "createdAt": "2018-06-25T09:16:35.516Z",
            "_id": "5b30b2f36c492c55a818b455",
            "email": "some@email.com",
            "password": "$2b$08$k5IRBF.1i.q.7D/BD4HCVuOdnIRDQOHaT6icNwIyc1XfeklUwyF5.",
            "__v": 0
        },
        "$init": true,
        "some": "change"
    }
}

См. Разницу между RAW и COPY . Согласно моему пониманию

  1. Object.assign () просто создает копию объекта с новым адресом памяти.
  2. Тогда RAW.email должно быть РАВНО к COPY.email (но не ПОЧЕМУ?)

Очевидно, что COPY содержит информацию из MongoDB, если RAW уже имел эти данные (скрытые), то как RAW.email может получить данные, тогда как COPY.email равно undefined.

КАК работает эта абстракция в случае RAW?

1 Ответ

0 голосов
/ 25 июня 2018

Как Экспресс res.json Документация Состояния,

Отправляет ответ JSON.Этот метод отправляет ответ (с правильным типом содержимого), который является параметром, преобразованным в строку JSON с использованием JSON.stringify ().

И JSON.stringify использует метод toJSON где доступно, чтобы получить значения объекта.Документы Mongoose поддерживают это .

Так как toJSON не является собственным перечислимым методом usr, он опускается, когда он копируется с Object.assign({}, usr), поэтому объект обрабатывается как есть.JSON.stringify и внутренние свойства документа открыты.

Вероятно, должно быть:

 res.json({
      RAW: usr,
      COPY: Object.assign({}, usr.toJSON(), {some: 'change'})
 }) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...