Node.js hasOwnProperty не работает, даже если свойство существует - PullRequest
0 голосов
/ 14 ноября 2018

В моем приложении Node.js Express, когда пользователь вошел в систему по паспорту, пользовательский объект пользователя сохраняется в запросе.

Это выглядит примерно так:

{
    "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"
}

Но не у каждого пользователя есть ключ 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.

Что мне здесь не хватает?

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Я проверил код, и все проверки вернули 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
}

Попробуйте JSON.parse (), возможно req.user сохранено как строка

0 голосов
/ 14 ноября 2018

Поскольку 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, как вы делаете.

...