Ответ 1
Чтобы использовать delete
, вам нужно будет преобразовать документ модели в простой объект JavaScript, вызвав toObject
, чтобы вы могли свободно манипулировать им:
user = user.toObject();
delete user.salt;
delete user.pass;
Когда пользователь регистрируется с моим API, им возвращается объект пользователя. Перед возвратом объекта я удаляю хешированный пароль и свойства соли. Я должен использовать
user.salt = undefined;
user.pass = undefined;
Потому что когда я пытаюсь
delete user.salt;
delete user.pass;
свойства объекта все еще существуют и возвращаются.
Почему это?
Чтобы использовать delete
, вам нужно будет преобразовать документ модели в простой объект JavaScript, вызвав toObject
, чтобы вы могли свободно манипулировать им:
user = user.toObject();
delete user.salt;
delete user.pass;
Неконфигурируемые свойства не могут быть повторно настроены или удалены.
Вы должны использовать строгий режим, чтобы вместо ошибок молчания возникали ошибки в вашем лице:
(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>
Старый вопрос, но я бросаю свои 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()
Другое решение помимо вызова toObject
состоит в том, чтобы получить доступ к _doc
непосредственно из объекта mongoose и использовать оператор распространения ES6 для удаления нежелательных свойств как таковых:
user = { ...user._doc, salt: undefined, pass: undefined }