2015-02-25 2 views
4

мои адреса выглядеть на данный момент:укоротить ObjectId в Node.js и Mongoose

http://www.sitename.com/watch?companyId=507f1f77bcf86cd799439011&employeeId=507f191e810c19729de860ea&someOtherId=..... 

Итак, как вы можете видеть, это становится довольно долго, довольно быстро. Я думал об укорочении этих объектов. Идея заключается в том, что я должен добавить новое поле под названием shortId для каждой модели в моей базе данных. Поэтому вместо того, чтобы:

var CompanySchema = mongoose.Schema({ 
    /* _id will be added automatically by mongoose */ 
    name:   {type: String}, 
    address:  {type: String}, 
    directorName: {type: String} 
}); 

мы бы это:

var CompanySchema = mongoose.Schema({ 
    /* _id will be added automatically by mongoose */ 
    shortId:  {type: String}, /* WE SHOULD ADD THIS */ 
    name:   {type: String}, 
    address:  {type: String}, 
    directorName: {type: String}, 
}); 

Я нашел способ сделать это следующим образом:

// Encode 
var b64 = new Buffer('47cc67093475061e3d95369d', 'hex') 
    .toString('base64') 
    .replace('+','-') 
    .replace('/','_') 
; 
// -> shortID is now: R8xnCTR1Bh49lTad 

Но я все еще думаю, что это может быть короче.

Кроме того, я нашел этот модуль npm: https://www.npmjs.com/package/short-mongo-id , но я не вижу, что он используется слишком много, поэтому я не могу сказать, надежен ли он.

У кого-нибудь есть предложения?

ответ

9

Я закончил тем, что делал это так:

Установите модуль (https://www.npmjs.com/package/shortid) ShortID Теперь вам нужно как-то придерживаться этой ShortID к вашим объектам, когда они сохраняются в базе данных. Я нашел, что самый простой способ сделать это - добавить эту функциональность в конце функции mongoose под названием «save()» (или «saveAsync()», если вы обещали свою модель). Вы можете сделать это следующим образом:

var saveRef = Company.save; 
Company.save = function() { 
    var args = Array.prototype.slice.call(arguments, 0); 
    // Add shortId to this company 
    args[0].shortId = shortId.generate(); 
    return saveRef.apply(this, args); 
}; 

Таким образом, вы просто в основном в каждой функции Model.save() добавить эту функцию, чтобы добавить ShortID. Ничего не поделаешь.

Редактировать: Кроме того, я обнаружил, что вы можете сделать это лучше и чище, как это прямо в Схеме.

var shortId = require('shortid'); 
var CompanySchema = mongoose.Schema({ 
    /* _id will be added automatically by mongoose */ 
    shortId: {type: String, unique: true, default: shortId.generate}, /* WE SHOULD ADD THIS */ 
    name: {type: String}, 
    address: {type: String}, 
    directorName: {type: String} 
}); 
+1

Привет, shortId даст уникальную строку даже после перезапуска сервера? –

+0

@NallaSrinivas - да, это будет. Существует документация на сайте npm https://www.npmjs.com/package/shortid – Drag0

0

Все существующие модули используют 64 таблицы символов для преобразования. Поэтому они должны использовать символы «-» и «_» в кодировке. Он вызывает кодировку url, когда вы делитесь коротким URL-адресом через твиттер или facebook. Поэтому будьте осторожны с этим. Я использую свой собственный короткий модуль id id-shorter, свободный от этой проблемы, потому что он использует буквенно-цифровой набор для преобразования. Желаю успеха!

Смежные вопросы