2015-04-22 4 views
6

У меня возник вопрос, я не смог найти ответа на мои исследования в Интернете. Я работаю над веб-приложением в Node.js и Cassandra. В настоящее время я работаю над системой уведомлений, и мне нужно сравнить два uuids, чтобы я не отправлял уведомление тем людям, которые делают оригинальное действие (что вызывает уведомление).Сравнение двух uuids в Node.js

Проблема в том, что, когда я сравниваю два uuids, которые должны быть равны, я всегда получаю ложное значение.

Вот пример кода, который я сейчас работаю над:

console.log('user_id :', user_id.user_id); 
console.log("user id of the current user :", this.user_id); 

console.log(user_id.user_id == this.user_id); 
console.log(user_id.user_id === this.user_id); 

А вот отображение результата:

user_id : Uuid: 29f1227d-58dd-4ddb-b0fa-19b7fc02fbe8 
user id of the current user : Uuid: 29f1227d-58dd-4ddb-b0fa-19b7fc02fbe8 
false 
false 
user_id : Uuid: c8f9c196-2d63-4cf0-b388-f11bfb1a476b 
user id of the current user : Uuid: 29f1227d-58dd-4ddb-b0fa-19b7fc02fbe8 
false 
false 

Как вы можете видеть, первые UUID, как предполагается быть одинаковым. Они генерируются с помощью библиотеки uuid внутри драйвера nodejs cassandra. Я не понимаю, почему я не могу сравнивать их, когда я могу выполнить любой запрос в моей базе данных Cassandra с указанным uuid.

Если кто-то может мне помочь, это будет большим удовольствием!

+0

Что такое 'typeof user_id.user_id' и' typeof this.user_id'? Я уверен, что они (разные) объекты, а не строки. Причиной является то, что идентификаторы имеют префикс 'Uuid:' в выводе, который может исходить из реализации 'toString()' объекта. – mscdex

+0

Действительно, user_id и this.user_id - оба разных объекта, поэтому простой === недостаточно для их сравнения. – Orodan

ответ

4

Как указано в Ary, содержимое одного и того же, но адресов нет, поэтому сравнение возвращает false.

объекта UUID Кассандры-водитель обеспечивает равенства функции, которая сравнивает необработанную шестигранную строку содержимого UUID, что вы могли бы использовать для этого:

> var uuid1 = uuid.fromString('29f1227d-58dd-4ddb-b0fa-19b7fc02fbe8') 
> var uuid2 = uuid.fromString('29f1227d-58dd-4ddb-b0fa-19b7fc02fbe8') 
> uuid1 == uuid2 
false 
> uuid1 === uuid2 
false 
> uuid1.equals(uuid2) 
true 
+0

Большое спасибо, я не знал о методе equals от объекта UUID cassandra-драйвера. Действительно, если я сравниваю их с этим методом, он возвращает ожидаемый результат. – Orodan

-1

Похоже, что ваш user_id на самом деле представляет собой объект, содержащий «Uuid», а не сам Uuid. Объекты user_id не совпадают, но содержат одни и те же данные.

Попробуйте сравнивая UUID можно прямо как:

console.log(user_id.user_id.Uuid == this.user_id.Uuid); 
console.log(user_id.user_id.Uuid === this.user_id.Uuid); 
+0

Отображение «user_id» и «this.user_id» происходит именно потому, что они являются объектами. Поэтому даже если он показывает «Uuid: value», это просто дисплей, Uuid не является свойством объекта, поэтому «user_id.user_id.Uuid» и «this.user_id.Uuid» возвращают «undefined». – Orodan

1

Содержание является тем же самым, но их адреса не должно быть. Если ваш comparaison возвращает false, это могут быть ваши переменные типа Object.

+0

Это правда, поскольку вы сказали, что это оба объекта, поэтому я не мог сравнить их с простым «===». – Orodan

0

я сделать что-то вроде этого, и она работает:

// assuming there are 2 uuids, uuidOne uuidTwo 
uuidOne.toString() === uuidTwo.toString() 
Смежные вопросы