Jak wygenerować unikalny identyfikator za pomocą węzła.js
function generate(count) {
var founded = false,
_sym = 'abcdefghijklmnopqrstuvwxyz1234567890',
str = '';
while(!founded) {
for(var i = 0; i < count; i++) {
str += _sym[parseInt(Math.random() * (_sym.length))];
}
base.getID(string, function(err, res) {
if(!res.length) {
founded = true; // How to do it?
}
});
}
return str;
}
Jak ustawić wartość zmiennej z zapytaniem oddzwaniającym do bazy danych? Jak mogę to zrobić?
Z góry dzięki.7 answers
Minęło trochę czasu odkąd użyłem node.js, ale myślę, że będę w stanie pomóc.
Po pierwsze, w node masz tylko jeden wątek i powinieneś używać wywołań zwrotnych. Co się stanie z Twoim kodem, to to, że base.getID
zapytanie zostanie ustawione w kolejce do wykonania, ale pętla while
będzie nadal działać jako pętla zajęta bez końca.
Powinieneś być w stanie rozwiązać swój problem z wywołaniem zwrotnym w następujący sposób:
function generate(count, k) {
var _sym = 'abcdefghijklmnopqrstuvwxyz1234567890',
var str = '';
for(var i = 0; i < count; i++) {
str += _sym[parseInt(Math.random() * (_sym.length))];
}
base.getID(str, function(err, res) {
if(!res.length) {
k(str) // use the continuation
} else generate(count, k) // otherwise, recurse on generate
});
}
I użyj go jako takiego
generate(10, function(uniqueId){
// have a uniqueId
})
Nie zakodowałem żadnego node / js od około 2 lat i nie testowałem tego, ale podstawowa idea powinna się trzymać – nie używaj pętli zajętej i używaj wywołań zwrotnych. Możesz chcieć rzucić okiem na pakiet asynchroniczny węzła.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-27 20:59:00
Użyj https://github.com/broofa/node-uuid
npm install uuid
var uuid = require('uuid');
Następnie utwórz kilka identyfikatorów ...
// Generate a v1 (time-based) id
uuid.v1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a'
// Generate a v4 (random) id
uuid.v4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1'
** Aktualizacja 3.1.0
Powyższe użycie toprzestarzałe , więc użyj tego pakietu w następujący sposób:
const uuidv1 = require('uuid/v1');
uuidv1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a'
const uuidv4 = require('uuid/v4');
uuidv4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-09 19:55:25
Najszybszy możliwy sposób utworzenia losowego 32-znakowego łańcucha w Node jest za pomocą natywnego modułu crypto
:
const crypto = require("crypto");
const id = crypto.randomBytes(16).toString("hex");
console.log(id); // => f9b327e70bbcf42494ccb28b2d98e00e
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-22 11:47:45
Innym podejściem jest użycie shortid pakietu z npm.
Jest bardzo łatwy w użyciu:var shortid = require('shortid');
console.log(shortid.generate()); // e.g. S1cudXAF
I ma kilka atrakcyjnych cech:
ShortId tworzy niezwykle krótkie, niestandardowe unikaty przyjazne url dokumenty. Idealny do skracania adresów url, identyfikatorów MongoDB i Redis oraz innych użytkownicy id mogą zobaczyć.
- domyślnie 7-14 znaków przyjaznych url: A-Z, a-z, 0-9, _-
Nie są sekwencyjne, więc nie są przewidywalne.- Can Generuj dowolną liczbę identyfikatorów bez duplikatów, nawet miliony dziennie.
- aplikacje mogą być restartowane dowolną liczbę razy bez możliwości powtórzenia identyfikatora.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-14 17:27:12
node-uuid
jest przestarzały, więc proszę użyć uuid
npm install uuid --save
// Generate a v1 UUID (time-based)
const uuidV1 = require('uuid/v1');
uuidV1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a'
// Generate a v4 UUID (random)
const uuidV4 = require('uuid/v4');
uuidV4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-18 15:18:16
Łatwiejsze i bez dodatkowych modułów
Math.random().toString(26).slice(2)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-21 20:37:04
Jeśli ktoś potrzebuje silnego kryptograficznie identyfikatora UUID, jest na to rozwiązanie.
Https://www.npmjs.com/package/generate-safe-id
npm install generate-safe-id
Dlaczego nie UUIDs?Losowe uuid (UUIDv4) nie mają wystarczającej entropii , aby być uniwersalnym niepowtarzalny (ironiczny, co?). Losowe Uuidy mają tylko 122 bity entropii, co sugeruje, że duplikat pojawi się dopiero po2^61 dokumenty. Dodatkowo niektóre implementacje UUIDv4 nie używać a kryptograficznie silny generator liczb losowych.
Ta biblioteka generuje 240-bitowe identyfikatory używając węzła.js crypto RNG, sugerowanie, że pierwszy duplikat pojawi się po wygenerowaniu 2^120 dokumenty. W oparciu o obecną produkcję energii rasy ludzkiej, to próg będzie niemożliwy do przekroczenia w przewidywalnej przyszłości.
var generateSafeId = require('generate-safe-id');
var id = generateSafeId();
// id == "zVPkWyvgRW-7pSk0iRzEhdnPcnWfMRi-ZcaPxrHA"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-30 18:00:02