Синтаксис Spread возвращает неожиданный объект - PullRequest
0 голосов
/ 01 марта 2019

Я использую узел, и я использовал.

babel-node

    "start": "nodemon --exec babel-node --presets es2015 index.js"

Мой синтаксис спреда не работает должным образом.Вот мой код.

   export const login = async (parentValue, { email, password }) => {
  try {
    const user = await User.findOne({
      email
    });
    console.log(user);

    if (!user.authenticateUser(password)) {
      throw new Error('Wrong password');
    }
    const dummyObject = {
      ...user
    };
    console.log({ dummyObject });
    return { ...user };
  } catch (e) {
    console.log(e);
    throw new Error(e.message);
  }
};

Строка, где я использовал console.log(user), работает нормально.Возвращает { id: xxx, name: xxxx }

и я получаю неожиданные данные по console.log(dummyObject);вот что я получаю.

{ jojo: 
{ '$__': 
      InternalCache {
        strictMode: true,
        selected: {},
        shardval: undefined,
        saveError: undefined,
        validationError: undefined,
        adhocPaths: undefined,
        removing: undefined,
        inserting: undefined,
        saving: undefined,
        version: undefined,
        getters: {},
        _id: 5c798295f53323b34cabf1ca,
        populate: undefined,
        populated: undefined,
        wasPopulated: false,
        scope: undefined,
        activePaths: [Object],
        pathsToScopes: {},
        cachedRequired: {},
        session: undefined,
        ownerDocument: undefined,
        fullPath: undefined,
        emitter: [Object],
        '$options': [Object] },
     isNew: false,
     errors: undefined,
     _doc: 
      { _id: 5c798295f53323b34cabf1ca,
        fullName: 'sarmad',
        password: '$2a$10$c.XDX75ORXYA4V/hUXWh.usVf2TibmKfY.Zpu3cpTssFaYvsGyhte',
        email: 'sarmad@gmail.com',
        createdAt: 2019-03-01T19:05:57.454Z,
        updatedAt: 2019-03-01T19:05:57.454Z,
        __v: 0 },
     '$init': true } }

Я что-то не так делаю?Технически это должно вернуть пользовательский объект. ПРИМЕЧАНИЕ: я не хочу использовать Object.assign

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Вы получаете разные журналы, потому что mongoose использует пользовательскую функцию проверки

Попробуйте это в узле:

const obj = {
  [Symbol.for('nodejs.util.inspect.custom')]() {
    return "totally not an object";
  }
}

console.log(obj); // "totally not an object"

Так как mongoose inspect определен в прототипе объекта, он не копируется, когда выиспользуйте ..., поскольку распространение только копирует собственные свойства объекта.

class Obj {
  [Symbol.for('nodejs.util.inspect.custom')]() {
    return "totally not an object";
  }
}

const obj = new Obj();
const obj2 = { ...obj };


console.log(obj); // "totally not an object"
console.log(obj2); // {}

Вы можете исправить это, установив прототип для скопированного объекта:

Reflect.setPrototypeOf(obj2, Reflect.getPrototypeOf(obj))

, но поскольку вы имеете дело с пользовательскимобъекты, распространяемые объектами, на самом деле не должны использоваться.Спред безопасен только для POJO.В противном случае вы можете легко попасть в неприятности (со скрытыми подпорками, добытчиками, сеттерами и адом-прототипом)

https://repl.it/repls/ToughModestInstructionset

https://github.com/Automattic/mongoose/blob/master/lib/document.js#L2853:L2869

https://nodejs.org/api/all.html#util_util_inspect_custom

0 голосов
/ 01 марта 2019

Похоже, вы используете mongoose, и похоже, что вы получаете свойства объекта mongoose с помощью оператора распространения.Вам нужно преобразовать в JSON, чтобы избавиться от них.

Попробуйте: const dummyObject = { ...user.toJSON() };

Вы также можете: const dummyObject = { ...user.toObject() };

^ Это может быть предпочтительный способ

Другое решение - запросить толькопростой объект при выполнении запроса.Например:

Schema.findOne(query).lean()

Это вернет простой объект вместо мангуста.

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