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.7 answers
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.
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'
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
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.
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'
Mais fácil e sem módulos de adição
Math.random().toString(26).slice(2)
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"