Почему я не могу удалить свойства объекта модели мангуста?

Когда пользователь регистрируется с моим API, им возвращается объект пользователя. Перед возвратом объекта я удаляю хешированный пароль и свойства соли. Я должен использовать

user.salt = undefined;
user.pass = undefined;

Потому что когда я пытаюсь

delete user.salt;
delete user.pass;

свойства объекта все еще существуют и возвращаются.

Почему это?

Ответы

Ответ 1

Чтобы использовать delete, вам нужно будет преобразовать документ модели в простой объект JavaScript, вызвав toObject, чтобы вы могли свободно манипулировать им:

user = user.toObject();
delete user.salt;
delete user.pass;

Ответ 2

Неконфигурируемые свойства не могут быть повторно настроены или удалены.

Вы должны использовать строгий режим, чтобы вместо ошибок молчания возникали ошибки в вашем лице:

(function() {
    "use strict";
     var o = {};
     Object.defineProperty(o, "key", {
         value: "value",
         configurable: false,
         writable: true,
         enumerable: true
     });
     delete o.key;
})()
// TypeError: Cannot delete property 'key' of #<Object>

Ответ 3

Старый вопрос, но я бросаю свои 2 цента в драку....

На ваш вопрос уже правильно ответили другие, это всего лишь демонстрация того, как я работал над этим.

Я использовал Object.entries() + Array.reduce(), чтобы решить это. Вот мой дубль:

// define dis-allowed keys and values
const disAllowedKeys = ['_id','__v','password'];
const disAllowedValues = [null, undefined, ''];

// our object, maybe a Mongoose model, or some API response
const someObject = {
  _id: 132456789,
  password: '$1$O3JMY.Tw$AdLnLjQ/5jXF9.MTp3gHv/',
  name: 'John Edward',
  age: 29,
  favoriteFood: null
}; 

// use reduce to create a new object with everything EXCEPT our dis-allowed keys and values!
const withOnlyGoodValues = Object.entries(someObject).reduce((ourNewObject, pair) => {
  const key = pair[0];
  const value = pair[1]; 
  if (
    disAllowedKeys.includes(key) === false &&
    disAllowedValues.includes(value) === false
  ){
    ourNewObject[key] = value; 
  }
  return ourNewObject; 
}, {}); 

// what we get back...
// {
//   name: 'John Edward',
//   age: 29
// }

// do something with the new object!
server.sendToClient(withOnlyGoodValues);

Это можно исправить, когда вы поймете, как это работает, особенно с некоторым причудливым синтаксисом ES6. Я намеренно попытался сделать его более читабельным, ради демо.

Прочитайте документы о том, как работает Object.entries(): MDN - Object.entries() Прочитайте документы о том, как работает Array.reduce(): MDN - Array.reduce()

Ответ 4

Другое решение помимо вызова toObject состоит в том, чтобы получить доступ к _doc непосредственно из объекта mongoose и использовать оператор распространения ES6 для удаления нежелательных свойств как таковых:

user = { ...user._doc, salt: undefined, pass: undefined }