Я пишу API в node.js. Первая конечная точка веб-сервиса - /create
- создает новую запись в БД с рандомизированным 6-символьным хешем, очень похожим на хэш bit.ly.
Сделав нечто подобное в PHP, я написал цикл do..while
, который генерирует случайную строку и проверяет мой mysql db (используя node-mysql), чтобы убедиться, что он бесплатный. У меня также есть счетчик, поэтому я могу потерпеть неудачу после x
итераций, если это необходимо.
var i = 0;
var alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];
var hash = null;
var success = false;
do {
// generate a random hash by shuffling the alphabet,
// joining it and getting 6 chars
hash = alphabet.sort(function(){
return 0.5 - Math.random();
}).join('').substr(0,6);
console.log(i + ': checking hash ' + hash);
// see if it exists in the db
db.query("SELECT hash FROM trips WHERE hash = " + hash, function(err, results){
if(results.length == 0) {
// the hash is free to use :)
success = true;
} else {
// the hash is already taken :(
success = false;
}
});
// increment the counter
i++;
} while(success === false && i < 10);
В настоящее время у меня есть только один хэш в моей базе данных (abcdef
), но цикл становится равным десяти и завершается сбоем, потому что думает, что каждый новый хэш уже присутствует.
Я почти уверен, что это из-за неблокирующей природы node.js. Это, безусловно, хорошая вещь, но в моем случае мне нужен цикл для блокировки до тех пор, пока не вернется запрос.
Я почти уверен, что смогу взломать это, сделав что-то вроде:
var q = db.query(...);
Но я знаю, что это выбрасывает главную особенность node.js.
Существует ли шаблон кода для такого рода потребностей?