2016-06-28 2 views
0

Я пытаюсь создать функцию, которая генерирует случайный токен, который не существует в моей базе данных (Mongodb), и я использую уникальное свойство в моей пользовательской схеме. Это моя функция:генератор токенов в узле и выражение

var UniqueTokenGenerator = function() { 

     var token = uuid.v4(); 
     UserModel.findOne({token : token} , (err , user)=> { 

      if(err) 
       res.status(500).send(err); 
      else if(user){ 
       //1 
      }else if(!user){ 
       return token; //2 
      } 

     }); 

    }; 

Мои проблемы:

  1. Я хочу, если маркер существует позвонить UniqueTokenGenerator или что-то ... как петли.
  2. Токен не может быть возвращен.
  3. У кого-нибудь есть идея?

Я не хочу использовать какую-либо библиотеку, например jwt.

ответ

0

Два ответа:

Во-первых, вам не нужно, чтобы проверить базу данных, чтобы убедиться, что ваш UUID является уникальным. UUID настолько велики, что математически вы не столкнетесь с столкновением. См. Are GUID collisions possible?

Во-вторых, чтобы сделать то, что вы пытаетесь сделать, вам необходимо сделать вашу функцию асинхронной и доставить результат с помощью обратного вызова. Например.

var generateUniqueToken = (callback) => { 
    var token = uuid.v4(); 
    UserModel.findOne({ token: token }, (err, user) => { 
     if(err) { 
      // First parameter of the callback is an error. 
      callback(err); 
     } else if (user) { 
      // Try again. 
      generateUniqueToken(callback); 
     } else if (!user) { 
      // First parameter of the callback is an error. The second 
      // parameter is the successful result. 
      callback(null, token); 
     } 
    }); 
}; 

// Example usage: 
generateUniqueToken((err, token) => { 
    if (err) { 
     res.status(500).send(err); 
    } else { 
     // Use the token here. 
    } 
}); 
+0

tnx для вашего ответа ... но 1%, если 2 токена равны ...?! –

+0

Да, шанс 1%, если вы создадите 2.6 квинтиллиона токенов. На Земле всего 7,5 миллиарда человек. – smarx

+0

Для небольшой перспективы, если вы создали UUID для каждого человека на Земле, ваши шансы найти столкновение будут примерно 0,0000000000000000000 << 200 000 еще нулей здесь >> 0000001. Скорее всего, на следующий год вас ударит метеор, чем в случае столкновения. – smarx

Смежные вопросы