Как создать уникальный идентификатор с узлом.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;
}
Как установить значение переменной с помощью обратного вызова запроса к базе данных? Как я могу это сделать?
спасибо заранее.
7 ответов:
прошло некоторое время с тех пор, как я использовал узел.js, но я думаю, что смогу помочь.
во-первых, в узле, у вас есть только один поток и должны использовать обратные вызовы. Что произойдет с вашим кодом, это
base.getIDзапрос будет стоять в очереди на выполнение, ноwhileцикл будет непрерывно работать как занятый цикл бессмысленно.вы должны быть в состоянии решить вашу проблему с обратного вызова следующим образом:
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 }); }и использовать его в качестве такие
generate(10, function(uniqueId){ // have a uniqueId })Я не закодировал ни одного узла/js примерно за 2 года и не тестировал это, но основная идея должна держаться – не используйте цикл занятости и используйте обратные вызовы. Возможно, вы захотите взглянуть на асинхронный пакет узла.
использовать https://github.com/broofa/node-uuid
npm install uuid var uuid = require('uuid');затем создайте несколько идентификаторов ...
// 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'
**обновление 3.1.0
Вышеуказанное использование устаревший, так что используйте этот пакет вроде этого:const uuidv1 = require('uuid/v1'); uuidv1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a' const uuidv4 = require('uuid/v4'); uuidv4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1'
самый быстрый способ создать случайную 32-символьную строку в узле-это использовать native
cryptoмодуль:const crypto = require("crypto"); const id = crypto.randomBytes(16).toString("hex"); console.log(id); // => f9b327e70bbcf42494ccb28b2d98e00e
другой подход использует shortid от НПМ.
Он очень прост в использовании:
var shortid = require('shortid'); console.log(shortid.generate()); // e.g. S1cudXAFи имеет некоторые интересные функции:
ShortId создает удивительно короткий не последовательный url-дружественный уникальный идентификационная карточка. Идеально подходит для сокращения URL-адресов, MongoDB и Redis для удостоверения личности, и любые другие id пользователи могут видеть.
- по умолчанию 7-14 url-дружественные символы: A-Z, a-z, 0-9,_ -
- непоследовательные поэтому они не предсказуемы.
- может генерировать любое количество идентификаторов без дубликатов, даже миллионы в день.
- приложения может быть перезапущен любое количество раз без каких-либо шансов повторяющийся идентификатор.
node-uuidсчитается устаревшим, поэтому, пожалуйста, используйтеuuidnpm 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'
Если кому-то нужен криптографически сильный UUID, для этого тоже есть решение.
https://www.npmjs.com/package/generate-safe-id
npm install generate-safe-idпочему не UUIDs?
Случайные UUIDs (UUIDv4) не хватает энтропии чтобы быть универсально уникальный (иронично, да?). Случайные идентификаторы UUID только 122 биты энтропии, что предполагает, что дубликат будет происходить только после 2^61 идентификационная карточка. Кроме того, некоторые реализации UUIDv4 не используют криптографически сильный генератор случайных чисел.
эта библиотека создает 240-бит идентификаторы с помощью узла.JS crypto RNG, предполагая, что первый дубликат произойдет после генерации 2^120 идентификаторы. Основываясь на текущем производстве энергии человеческой расы, это порог будет невозможно в обозримом будущем.
var generateSafeId = require('generate-safe-id'); var id = generateSafeId(); // id == "zVPkWyvgRW-7pSk0iRzEhdnPcnWfMRi-ZcaPxrHA"
Comments