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.
Author: owl, 2014-04-27

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.

 11
Author: rafalio,
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' 
 162
Author: Vinz243,
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
 100
Author: Pono,
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.
 17
Author: str,
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' 

Npm link

 9
Author: Praveena,
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)
 6
Author: Yaroslav Gaponov,
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"
 1
Author: ch3ll0v3k,
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