REST API使用'slug而不是'_id'

时间:2014-01-28 15:04:34

标签: node.js rest backbone.js mongoose

我正在尝试找出一种优雅的方法来为主要仅处理slugs而不是ids的网站创建REST API。此API将使用Backbone Marionette / Backbone-Relational前端在Node.JS / Express / MongoDB / Mongoose中编写。

我不需要直接处理典型的_id,因为我的目标是使我的端点像/api/articles/some-article-title

我原本以为实际上同时使用_idsslugs,让它动态返回一个新的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兼容端点。

以前有人必须建造这样的东西吗?有关此的最佳做法吗?

谢谢!

0 个答案:

没有答案