简体   繁体   English

即使属性存在,Node.js hasOwnProperty也不起作用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM