我的网址目前看起来像这样:
http://www.sitename.com/watch?companyId=507f1f77bcf86cd799439011&employeeId=507f191e810c19729de860ea&someOtherId=.....
所以,正如你所看到的,它变得非常长,非常快。 我在考虑缩短这些ObjectIds。 想法是我应该添加名为" 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 但是我没有看到它被过多使用,所以我无法判断它是否可靠。
有人有什么建议吗?
答案 0 :(得分:14)
我最终这样做了:
安装shortId模块(https://www.npmjs.com/package/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。那是那个。
编辑: 另外,我发现你可以在Schema中直接做得更好,更干净。
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 :(得分:0)
所有现有模块都使用64个字符表进行转换。所以他们必须使用' - '和' _' charset中的chars。当您通过Twitter或Facebook共享短网址时,它会导致网址编码。所以要小心。 我使用自己的短ID模块id-shorter解决了这个问题,因为它使用字母数字集进行转换。 祝你成功!