Como gerar ID único com nó.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;
}

Como definir um valor variável com o callback da pesquisa da base de dados? Como posso fazê-lo?

Obrigado antecipadamente.

Author: owl, 2014-04-27

7 answers

Já passou algum tempo desde que usei o nó.js, mas acho que posso ajudar.

Em Primeiro Lugar, no nó, você só tem um único tópico e é suposto usar callbacks. O que vai acontecer com o seu código, é que a consulta base.getID vai ficar em fila de espera para a execução, mas o laço while vai continuar a correr como um laço ocupado sem parar.

Você deve ser capaz de resolver o seu problema com um callback do seguinte modo:

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

E usá - lo como tal

generate(10, function(uniqueId){
  // have a uniqueId
})
Não codificei nenhuma. node / js em cerca de 2 anos e não testaram isso, mas a idéia básica deve manter – se-não use um loop ocupado, e usar callbacks. Você pode querer dar uma olhada no Pacote nodo async.
 11
Author: rafalio, 2014-04-27 20:59:00

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

npm install uuid
var uuid = require('uuid');
Então cria algumas identificações ...
// 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'

** actualizar 3.1.0
A utilização acima é desactualizada , por isso use este pacote desta forma:

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, 2017-11-09 19:55:25

A forma mais rápida possível de criar uma cadeia aleatória de 32 caracteres no nó é usando o módulo native crypto:

const crypto = require("crypto");

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

console.log(id); // => f9b327e70bbcf42494ccb28b2d98e00e
 100
Author: Pono, 2016-10-22 11:47:45

Outra abordagem é usar o pacote shortid do npm.

É muito fácil de usar:

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

E tem algumas características convincentes:

ShortId cria incrivelmente curto Não-Sequencial URL-friendly unique identificacao. Perfeito para abreviadores de url, ids MongoDB e Redis, e qualquer outro os utilizadores de id podem ver.

  • por omissão, 7-14 caracteres amigáveis com url: A-Z, A-z, 0-9, _-
  • não sequenciais, por isso não são previsíveis.
  • pode gerar qualquer número de ids sem duplicados, mesmo milhões por dia.
  • Os aplicativos podem ser reiniciados em qualquer número de vezes sem qualquer chance de repetir um id.
 17
Author: str, 2016-08-14 17:27:12

node-uuid está desactualizado, por isso use 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' 

Ligação Npm

 9
Author: Praveena, 2017-01-18 15:18:16

Mais fácil e sem módulos de adição

Math.random().toString(26).slice(2)
 6
Author: Yaroslav Gaponov, 2017-09-21 20:37:04

Se alguém precisa de UUID criptográfico-forte, há solução para isso também.

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

npm install generate-safe-id
Porque não UUIDs?

UUIDs aleatórios (UUIDv4) não têm entropia suficiente para serem universalmente único (irónico, não é?). Os Uuídeos aleatórios têm apenas 122 bits de entropia, o que sugere que um duplicado irá ocorrer depois de apenas 2^61 identificações. Além disso, algumas implementações UUIDv4 não utilize a gerador de números aleatórios criptograficamente fortes.

Esta biblioteca gera IDs de 240 bits usando o nó.crypto RNG js, sugerindo que o primeiro duplicado irá ocorrer depois de gerar 2^120 identificações. Com base na atual produção de energia da raça humana, este o limiar será impossível de atravessar num futuro previsível.

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

var id = generateSafeId();
// id == "zVPkWyvgRW-7pSk0iRzEhdnPcnWfMRi-ZcaPxrHA"
 1
Author: ch3ll0v3k, 2017-07-30 18:00:02