[英]Node.js hasOwnProperty does not work even when the property exists
In my Node.js Express application, when the user is logged in via passport the user user object is saved in the request. 在我的Node.js Express应用程序中,当用户通过通行证登录时,用户用户对象保存在请求中。
It looks something like this: 看起来像这样:
{
"uuid": "caa5cb58-ef92-4de5-a419-ef1478b05dad",
"first_name": "Sam",
"last_name": "Smith",
"email": "sam@email.com",
"password": "$2a$10$fXYBeoK6s.A8xo2Yfgx4feTLRXpdvaCykZxr7hErKaZDAVeplk.WG",
"profile_uuid": "db172902-f3c9-456d-8814-53d07d4ea954",
"isActive": true,
"deactivate": false,
"verified": true,
"ProviderUuid": "7149f8f1-0208-41db-a78e-887e7811a169"
}
But not every user has the ProviderUuid key present. 但是,并非每个用户都有ProviderUuid密钥。 So before using its value I am trying to check if the ProviderUuid key is present in the user object
因此,在使用其值之前,我尝试检查ProviderUuid键是否存在于用户对象中
var user = req.user;
console.log('---- provider: ' + JSON.stringify(user));
console.log('--- prop: ' + user.hasOwnProperty('ProviderUuid')); //returns false
console.log('---- other method prop check: ' + Object.prototype.hasOwnProperty.call(user, "ProviderUuid")); //returns false
if('ProviderUuid' in user){
//this returns true
}
So doing user.hasOwnProperty('ProviderUuid'
) and Object.prototype.hasOwnProperty.call(user, "ProviderUuid"))
returns false, however 'ProviderUuid' in user
returns true. 因此,执行
user.hasOwnProperty('ProviderUuid'
)和Object.prototype.hasOwnProperty.call(user, "ProviderUuid"))
返回false,但是'ProviderUuid' in user
返回true。
What am I missing here? 我在这里想念什么?
Since in
works, the property must an inherited property, on one of user
's prototype objects, rather than being on user
itself. 由于
in
工作中,该属性必须是user
原型对象之一上的继承属性,而不是user
本身。 Here's a live example of such behavior: 这是这种行为的实时示例:
const userProto = { foo: 'bar' }; // Create an empty object named `user` whose internal prototype is `userProto`: const user = Object.create(userProto); // False, user itself is an empty object, nothing's been assigned to it: console.log( user.hasOwnProperty('foo') ); // True, `foo` does exist on the *internal prototype* of the `user` object: console.log( 'foo' in user ); // True, `foo` is a property directly on `userProto`: console.log( userProto.hasOwnProperty('foo') );
So, if you want to check for the existence of an inherited property named ProviderUuid
, use the in
operator like you're doing. 因此,如果要检查是否存在名为
ProviderUuid
的继承属性,请像执行操作一样使用in
运算符。
I tested code and all checks returned true. 我测试了代码,所有检查均返回true。
var user = { "uuid": "caa5cb58-ef92-4de5-a419-ef1478b05dad", "first_name": "Sam", "last_name": "Smith", "email": "sam@email.com", "password": "$2a$10$fXYBeoK6s.A8xo2Yfgx4feTLRXpdvaCykZxr7hErKaZDAVeplk.WG", "profile_uuid": "db172902-f3c9-456d-8814-53d07d4ea954", "isActive": true, "deactivate": false, "verified": true, "ProviderUuid": "7149f8f1-0208-41db-a78e-887e7811a169" }; console.log('---- provider: ' + JSON.stringify(user)); console.log('--- prop: ' + user.hasOwnProperty('ProviderUuid')); //returns false console.log('---- other method prop check: ' + Object.prototype.hasOwnProperty.call(user, "ProviderUuid")); //returns false if('ProviderUuid' in user){ //this returns true }
Try JSON.parse(), Maybe req.user
saved as string 尝试JSON.parse(),也许
req.user
保存为字符串
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.