为什么我不能删除mongoose模型的对象属性?

JuJ*_*oDi 22 javascript mongoose node.js

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

user.salt = undefined;
user.pass = undefined;
Run Code Online (Sandbox Code Playgroud)

因为当我尝试

delete user.salt;
delete user.pass;
Run Code Online (Sandbox Code Playgroud)

对象属性仍然存在并被返回.

这是为什么?

Joh*_*yHK 38

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

user = user.toObject();
delete user.salt;
delete user.pass;
Run Code Online (Sandbox Code Playgroud)

  • 天哪,我花了两个小时才找到这个。我好想哭啊。 (2认同)

Esa*_*ija 5

不可配置的属性无法重新配置或删除。

你应该使用严格模式,这样你就会得到面对面的错误而不是静默失败:

(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>
Run Code Online (Sandbox Code Playgroud)


The*_*978 5

与其使用 转换为 JavaScript 对象,不如通过Query.prototype.select()toObject()函数选择要排除的属性可能更理想。

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

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)
};
Run Code Online (Sandbox Code Playgroud)

然后,如果您想在包含所有用户的数组的响应中排除passsalt属性,您可以通过在属性名称前添加减号来专门选择要忽略的属性:

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);
    }
});
Run Code Online (Sandbox Code Playgroud)

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

        const result = await User
            .find({})
            .select("email name");
Run Code Online (Sandbox Code Playgroud)