我正在尝试找出一种优雅的方法来为主要仅处理slugs
而不是ids
的网站创建REST API。此API将使用Backbone Marionette / Backbone-Relational前端在Node.JS / Express / MongoDB / Mongoose中编写。
我不需要直接处理典型的_id
,因为我的目标是使我的端点像/api/articles/some-article-title
。
我原本以为实际上同时使用_ids
和slugs
,让它动态返回一个新的id
字段。
// Inside my controller
var slugQuery = function(slug){
var query = {$or: [{slug: slug}]};
if (slug.match(/^[0-9a-fA-F]{24}$/)) {
query.$or.push({_id: slug});
}
return query;
}
exports.getProfile = function (req, res) {
var slug = req.params.slug;
Profile.findOne( slugQuery(slug), function(err, profile){
if(err){
// DB Error
res.status(400);
res.end();
}else if(!profile){
res.status(404);
res.end();
}else{
res.json( profile.withId() );
}
});
};
// Method added to the model
ProfileSchema.methods.withId = function() {
var json = this.toObject();
// Use the slug or id
json.id = json.slug || json._id;
return json;
};
这对我来说似乎很苛刻,特别是因为有很多端点/模型需要像这样运行。当我想使用Mongooses populate
功能进行相当深度的文档链接时,它变得更加复杂。
我从理论上知道你'可以'逐字取消ObjectID
并将slug
直接存储在_id字段中,但是一旦插入_id
字段就无法更新如果确实发生了变化,你还需要更新文档的所有相关链接。
对我来说,这似乎是一个非常普遍的需求,一个基于slug
标识符的REST兼容端点。
以前有人必须建造这样的东西吗?有关此的最佳做法吗?
谢谢!