web-dev-qa-db-fra.com

Comment générer un identifiant unique avec node.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;
}

Comment définir une valeur de variable avec un rappel de requête de base de données? Comment je peux le faire?

126
owl

Cela fait un certain temps que j'ai utilisé node.js, mais je pense pouvoir vous aider.

Tout d’abord, dans node, vous n’avez qu’un seul thread et vous êtes censé utiliser des rappels. Ce qui se passera avec votre code, c’est que la requête base.getID sera mise en file d'attente pour l'exécution, mais la boucle while sera toujours exécutée comme une boucle occupée inutilement.

Vous devriez pouvoir résoudre votre problème avec un rappel comme suit:

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
    });
}

Et l'utiliser comme tel

generate(10, function(uniqueId){
  // have a uniqueId
})

Je n'ai pas codé de nœud/js depuis environ 2 ans et je n'ai pas testé cela, mais l'idée de base devrait rester - n'utilisez pas de boucle occupée et utilisez des rappels. Vous voudrez peut-être jeter un coup d'œil au package async du noeud.

14
rafalio

Utilisez https://github.com/broofa/node-uuid

npm install uuid
var uuid = require('uuid');

Puis créez des identifiants ...

// 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'

** UPDATE 3.1.0
L'utilisation ci-dessus est obsolète , utilisez ce paquet comme ceci:

const uuidv1 = require('uuid/v1');
uuidv1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a' 

const uuidv4 = require('uuid/v4');
uuidv4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1' 
247
Vinz243

Le moyen le plus rapide de créer une chaîne aléatoire de 32 caractères dans Node consiste à utiliser le module natif crypto:

const crypto = require("crypto");

const id = crypto.randomBytes(16).toString("hex");

console.log(id); // => f9b327e70bbcf42494ccb28b2d98e00e
175
Pono

Une autre approche utilise le package shortid de npm.

C'est très facile à utiliser:

var shortid = require('shortid');
console.log(shortid.generate()); // e.g. S1cudXAF

et a des caractéristiques convaincantes:

ShortId crée des identifiants uniques étonnamment courts, non séquentiels et conviviaux pour les URL. Parfait pour les raccourcisseurs d'URL, les identifiants MongoDB et Redis, ainsi que pour tout autre identifiant que les utilisateurs pourraient voir.

  • Par défaut 7 à 14 caractères conviviaux pour les URL: A à Z, a à z, 0 à 9, _-
  • Non séquentiels, ils ne sont donc pas prévisibles.
  • Peut générer un nombre illimité d'identifiants sans doublons, même des millions par jour.
  • Les applications peuvent être redémarrées autant de fois que nécessaire, sans aucune chance de répéter un identifiant.
24
str

node-uuid est obsolète, veuillez donc utiliser 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' 

lien NPM

16
Praveena

Plus facile et sans modules d'addition

Math.random().toString(26).slice(2)
6
Yaroslav Gaponov

Si quelqu'un a besoin d'un UUID hautement cryptographique, il existe également une solution à cela.

https://www.npmjs.com/package/generate-safe-id

npm install generate-safe-id

Pourquoi pas les UUID?

Les UUID aléatoires (UUIDv4) n'ont pas assez d'entropie pour être universellement uniques (ironique, hein?). Les UUID aléatoires ont seulement 122 bits d'entropie, ce qui suggère qu'un doublon se produira après seulement 2 ^ 61 ID. De plus, certaines implémentations UUIDv4 n'utilisent pas de générateur de nombre aléatoire cryptographiquement fort.

Cette bibliothèque génère des identifiants de 240 bits à l’aide du NGR.js crypto RNG, suggérant que le premier doublon se produira après la génération . 2 ^ 120 ID. Compte tenu de la production énergétique actuelle de la race humaine, il sera impossible de franchir ce seuil dans un avenir prévisible.

var generateSafeId = require('generate-safe-id');

var id = generateSafeId();
// id == "zVPkWyvgRW-7pSk0iRzEhdnPcnWfMRi-ZcaPxrHA"
1
ch3ll0v3k

Simple, basé sur le temps, sans dépendances:

(new Date()).getTime().toString(36)

Sortie: jzlatihl


plus un nombre aléatoire (Merci à la réponse de @Yaroslav Gaponov)

(new Date()).getTime().toString(36) + Math.random().toString(36).slice(2)

Sortie jzlavejjperpituute

0
safrazik