Javascript 删除对象 属性 不工作
Javascript delete object property not working
我是 运行 MEAN.js 上的某个项目,我遇到了以下问题。我想计算一些用户的个人资料并将其保存到数据库中。但是用户模型中的方法有问题:
UserSchema.pre('save', function(next) {
if (this.password && this.password.length > 6) {
this.salt = new Buffer(crypto.randomBytes(16).toString('base64'), 'base64');
this.password = this.hashPassword(this.password);
}
next();
});
如果我将更改后的密码发送出去,它会更改凭据,因此用户下次无法登录。我想在保存之前从用户对象中删除密码,但我做不到(让我们看看下面代码中的注释):
exports.signin = function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err || !user) {
res.status(400).send(info);
} else {
/* Some calculations and user's object changes */
req.login(user, function(err) {
if(err) {
res.status(400).send(err);
} else {
console.log(delete user.password); // returns true
console.log(user.password); // still returns password :(
//user.save();
//res.json(user);
}
});
}
})(req, res, next);
};
怎么了?为什么delete方法returns true,却没有任何反应?感谢您的帮助:)
javascript
中删除运算符有一定规则
- 如果 属性 在 "strict mode" 中是一个自己不可配置的 属性 那么它将 return false。
例如
x = 42; // creates the property x on the global object
var y = 43; // creates the property y on the global object, and marks it as non-configurable
// x is a property of the global object and can be deleted
delete x; // returns true
// y is not configurable, so it cannot be deleted
delete y; // returns false
- 如果对象从原型继承了属性,并且本身没有属性,则不能通过引用对象来删除属性。但是,您可以直接在原型上删除它。
例如
function Foo(){}
Foo.prototype.bar = 42;
var foo = new Foo();
// returns true, but with no effect,
// since bar is an inherited property
delete foo.bar;
// logs 42, property still inherited
console.log(foo.bar);
所以,请交叉检查这些点,有关更多信息,您可以阅读此 Link
就这样:
user.password = undefined;
而不是:
delete user.password;
并且密码属性不会出现在输出中。
有类似的问题。 delete
运算符 "was not working" 在特定情况下尝试从对象中删除 属性 时。使用 Lodash
unset
:
修复它
_.unset(user, "password");
https://lodash.com/docs/4.17.11#unset
否则 delete
运算符可以工作。为了以防万一,delete
操作员文档在这里:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete
遇到了类似的问题。这对我有用:
// create a new copy
let newUser= ({...user}._doc);
// delete the copy and use newUser that thereafter.
delete newUser.password;
上面来自 Majed A 的答案是适用于单个对象属性的最简单的解决方案,我们甚至可以通过删除 ...user
扩展器使其变得更容易。只需从 object._doc
sub-object 中删除 属性。在您的示例中,它应该是:
user.save()
delete user._doc.password
res.status(201).json(user) // The password will not be shown in JSON but it has been saved.
正在使用 MONGOOSE 吗?
如果您在使用 Mongoose(Mongo 数据库的上层)时遇到此问题,那么您可以在 [=14= 上使用 lean
属性 ] 方法
例子
没有lean(key不会被删除)
const users = await User.find({ role: 'user' }) // no lean method
users.forEach((user) => {
delete user.password. // doesn't delete the password
})
console.log(users)
/* [
{name:'John', password:'123'},
{name:'Susan', password:'456'}
]
*/
With lean(键被删除)
const users = await User.find({ role: 'user' }).lean()
users.forEach((user) => {
delete user.password // deletes the password
})
console.log(users)
/* [
{name:'John'},
{name:'Susan'}
]
*/
精益有效的原因
从启用精益选项的查询返回的文档是普通 javascript 对象,而不是 Mongoose 文档。它们没有保存方法、getters/setters、虚拟或其他 Mongoose 功能。
文档有点像 read-only,因此 delete
不适用于它们
参考 -
https://mongoosejs.com/docs/api.html#query_Query-lean
方法二不瘦
如果你想在查询时使用mongoose提供的方法删除一些属性,你可以使用select
方法删除,
const users = await User.find({ role: 'user' }).select('-password')
console.log(users)
/* [
{name:'John'},
{name:'Susan'}
]
*/
我是 运行 MEAN.js 上的某个项目,我遇到了以下问题。我想计算一些用户的个人资料并将其保存到数据库中。但是用户模型中的方法有问题:
UserSchema.pre('save', function(next) {
if (this.password && this.password.length > 6) {
this.salt = new Buffer(crypto.randomBytes(16).toString('base64'), 'base64');
this.password = this.hashPassword(this.password);
}
next();
});
如果我将更改后的密码发送出去,它会更改凭据,因此用户下次无法登录。我想在保存之前从用户对象中删除密码,但我做不到(让我们看看下面代码中的注释):
exports.signin = function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err || !user) {
res.status(400).send(info);
} else {
/* Some calculations and user's object changes */
req.login(user, function(err) {
if(err) {
res.status(400).send(err);
} else {
console.log(delete user.password); // returns true
console.log(user.password); // still returns password :(
//user.save();
//res.json(user);
}
});
}
})(req, res, next);
};
怎么了?为什么delete方法returns true,却没有任何反应?感谢您的帮助:)
javascript
中删除运算符有一定规则- 如果 属性 在 "strict mode" 中是一个自己不可配置的 属性 那么它将 return false。
例如
x = 42; // creates the property x on the global object
var y = 43; // creates the property y on the global object, and marks it as non-configurable
// x is a property of the global object and can be deleted
delete x; // returns true
// y is not configurable, so it cannot be deleted
delete y; // returns false
- 如果对象从原型继承了属性,并且本身没有属性,则不能通过引用对象来删除属性。但是,您可以直接在原型上删除它。
例如
function Foo(){}
Foo.prototype.bar = 42;
var foo = new Foo();
// returns true, but with no effect,
// since bar is an inherited property
delete foo.bar;
// logs 42, property still inherited
console.log(foo.bar);
所以,请交叉检查这些点,有关更多信息,您可以阅读此 Link
就这样:
user.password = undefined;
而不是:
delete user.password;
并且密码属性不会出现在输出中。
有类似的问题。 delete
运算符 "was not working" 在特定情况下尝试从对象中删除 属性 时。使用 Lodash
unset
:
_.unset(user, "password");
https://lodash.com/docs/4.17.11#unset
否则 delete
运算符可以工作。为了以防万一,delete
操作员文档在这里:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete
遇到了类似的问题。这对我有用:
// create a new copy
let newUser= ({...user}._doc);
// delete the copy and use newUser that thereafter.
delete newUser.password;
上面来自 Majed A 的答案是适用于单个对象属性的最简单的解决方案,我们甚至可以通过删除 ...user
扩展器使其变得更容易。只需从 object._doc
sub-object 中删除 属性。在您的示例中,它应该是:
user.save()
delete user._doc.password
res.status(201).json(user) // The password will not be shown in JSON but it has been saved.
正在使用 MONGOOSE 吗?
如果您在使用 Mongoose(Mongo 数据库的上层)时遇到此问题,那么您可以在 [=14= 上使用 lean
属性 ] 方法
例子
没有lean(key不会被删除)
const users = await User.find({ role: 'user' }) // no lean method
users.forEach((user) => {
delete user.password. // doesn't delete the password
})
console.log(users)
/* [
{name:'John', password:'123'},
{name:'Susan', password:'456'}
]
*/
With lean(键被删除)
const users = await User.find({ role: 'user' }).lean()
users.forEach((user) => {
delete user.password // deletes the password
})
console.log(users)
/* [
{name:'John'},
{name:'Susan'}
]
*/
精益有效的原因
从启用精益选项的查询返回的文档是普通 javascript 对象,而不是 Mongoose 文档。它们没有保存方法、getters/setters、虚拟或其他 Mongoose 功能。
文档有点像 read-only,因此 delete
不适用于它们
参考 -
方法二不瘦
如果你想在查询时使用mongoose提供的方法删除一些属性,你可以使用select
方法删除,
const users = await User.find({ role: 'user' }).select('-password')
console.log(users)
/* [
{name:'John'},
{name:'Susan'}
]
*/