Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么可以';删除猫鼬模型&x27;什么是对象属性?_Javascript_Node.js_Mongoose - Fatal编程技术网

Javascript 为什么可以';删除猫鼬模型&x27;什么是对象属性?

Javascript 为什么可以';删除猫鼬模型&x27;什么是对象属性?,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,当用户向my API注册时,将返回一个用户对象。在返回对象之前,我删除了散列密码和salt属性。我必须使用 user.salt = undefined; user.pass = undefined; 因为当我尝试的时候 delete user.salt; delete user.pass; 对象属性仍然存在并返回 为什么会这样?无法重新配置或删除不可配置的属性 你应该使用严格模式,这样你就可以面对错误而不是无声的失败: (function() { "use strict";

当用户向my API注册时,将返回一个用户对象。在返回对象之前,我删除了散列密码和salt属性。我必须使用

user.salt = undefined;
user.pass = undefined;
因为当我尝试的时候

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>
(函数(){
“严格使用”;
var o={};
Object.defineProperty(o,“键”{
值:“值”,
可配置:false,
可写:对,
可枚举:true
});
删除o.key;
})()
//TypeError:无法删除的属性“key”#

要使用
delete
,您需要通过调用将模型文档转换为普通JavaScript对象,以便可以自由操作它:

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

老问题,但我要把我的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()
如何工作的文档:
阅读有关
Array.reduce()
工作原理的文档:

除了调用
toObject
之外,另一个解决方案是直接从mongoose对象访问
\u doc
,并使用ES6 spread操作符删除不需要的属性,例如:

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

与其使用
toObject()
转换为JavaScript对象,不如通过函数选择要排除的属性

例如,如果您的用户架构如下所示:

const userSchema = new mongoose.Schema({

    email: {

        type: String,
        required: true,
    },
    name: {

        type: String,
        required: true
    },
    pass: {

        type: String,
        required: true
    },
    salt: {

        type: String,
        required: true
    }
});

module.exports = {

    User: mongoose.model("user", userSchema)
};
然后,如果要在包含所有用户数组的响应中排除
pass
salt
属性,可以通过在属性名称前加上减号来特别选择要忽略的属性:

users.get("/", async (req, res) => {

    try {

        const result = await User
            .find({})
            .select("-pass -salt");

        return res
            .status(200)
            .send(result);
    }
    catch (error) {

        console.error(error);
    }
});
或者,如果要排除的属性多于要包含的属性,则可以专门选择要添加的属性,而不是要删除的属性:

        const result = await User
            .find({})
            .select("email name");

我处于严格的状态,但没有什么阻止我,我不能那样做@强尼救了我一天