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

问题描述 投票:0回答:2

在我的Node.js Express应用程序中,当用户通过护照登录时,用户用户对象将保存在请求中。

它看起来像这样:

{
    "uuid": "caa5cb58-ef92-4de5-a419-ef1478b05dad",
    "first_name": "Sam",
    "last_name": "Smith",
    "email": "[email protected]",
    "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"
}

但并非每个用户都有ProviderUuid密钥。所以在使用它的值之前,我试图检查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
}

所以做user.hasOwnProperty('ProviderUuid')和Object.prototype.hasOwnProperty.call(user, "ProviderUuid"))返回false,但'ProviderUuid' in user返回true。

我在这里错过了什么?

javascript node.js hasownproperty
2个回答
4
投票

in起作用以来,该属性必须是user原型对象之一的继承属性,而不是user本身。以下是此类行为的实例:

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')
);

因此,如果要检查是否存在名为ProviderUuid的继承属性,请使用in运算符,就像您正在做的那样。


0
投票

我测试了代码并且所有检查都返回true。

var user = {
    "uuid": "caa5cb58-ef92-4de5-a419-ef1478b05dad",
    "first_name": "Sam",
    "last_name": "Smith",
    "email": "[email protected]",
    "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
}

尝试JSON.parse(),也许req.user保存为字符串

© www.soinside.com 2019 - 2024. All rights reserved.