2015-10-30 5 views
0

Я развивающийся эфемерное зашифрованное комнату в стеке MEAN и гадаю, как лучше структурировать этот кусок кода ...NodeJS/MongoDB Unique Value Check

Что я пытаюсь достичь:

  • Запрос POST получен для создания чата.
  • Производится случайная 8 символьная строка, которая станет идентификатором roomid (отдельно от mongo _id)
  • Необходимо убедиться, что строка еще не существует в базе данных. Если это так, мне нужно запустить генератор и снова сохранить его.

У меня есть этот код, который, очевидно, не будет работать, потому что вызов в базу данных асинхронен и приведет к сбою потока.

var chatroom = new Chatroom(); 
     var roomid = random.generate(8).toUpperCase(); 
     var unique = false; 

     while (!unique) { 
      Chatroom.count({roomid: roomid}, function (error, data) { 
       if (data < 1) { 
        chatroom.roomid = roomid; 
        chatroom.roomtitle = request.body.roomtitle; 
        chatroom.passphrase = request.body.passphrase; 
        unique = true; 
       } 
      }); 
     } 

     chatroom.save(function (error) { 
      if (error) { 
       response.json(apiResponse('fail', error)); 
      } 
      else { 
       response.json(apiResponse('success', chatroom)); 
      } 
     }); 

Любые предложения о том, как лучше структурировать этот код?

ответ

1

Я немного ржавый с MongoDB, но, возможно, это могло бы помочь:

var chatroom = new Chatroom(); 

function generate() {  
    var roomid = random.generate(8).toUpperCase(); 
    Chatroom.find({roomid: roomid}, function (error, data) { 
     if (data.length) { 
      chatroom.roomid = roomid; 
      chatroom.roomtitle = request.body.roomtitle; 
      chatroom.passphrase = request.body.passphrase; 
      save(); 
     } 
     else { 
      generate(); 
     } 
    }); 
} 

function save() { 
    chatroom.save(function (error) { 
     if (error) { 
      response.json(apiResponse('fail', error)); 
     } 
     else { 
      response.json(apiResponse('success', chatroom)); 
     } 
    }); 
} 

я обычно рекурсии более хороший способ реализации этих решений, что итерация - более интуитивным, по крайней мере.

+0

Согласен. Я думаю, что есть лучший способ, но я тоже этого не помню. – Rodmentou

+0

Спасибо, Джонатан. Должен был подумать о рекурсивном варианте раньше :(Все работает сейчас. Cheers. – Seonixx

+0

Я бы использовал приращение, скорее, искал случайное число. – webduvet