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?
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.
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'
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
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.
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'
Plus facile et sans modules d'addition
Math.random().toString(26).slice(2)
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"
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