【问题标题】:Express REST get post by slugExpress REST 由 slug 发布
【发布时间】:2014-01-28 23:02:26
【问题描述】:

我有这个 rest api:

'use strict';

/**
 * Module dependencies.
 */
var mongoose = require('mongoose'),
    Post = mongoose.model('Post'),
    _ = require('lodash');


/**
 * Find post by id
 */
exports.post = function(req, res, next, id) {
   Post.findOne({ '_id': id }, function (err, post) {
        if (err) {
            return next(err);
        }
        if (!post) {
            return next(new Error('Failed to load post ' + id));
        }
        req.post = post;
        next();
    });
};

/**
 * Create a post
 */
exports.create = function(req, res) {
    var post = new Post(req.body);
    post.save(function(err) {
        if (err) {
            res.jsonp(500,{ error: err.message });
        } else {
            res.jsonp(post);
        }
    });
};

/**
 * Update a post
 */
exports.update = function(req, res) {
    var post = req.post;
    post = _.extend(post, req.body);
    post.save(function(err) {
        if (err) {
             res.jsonp(500,{ error: err.message });
        } else {
            res.jsonp(post);
        }
    });
};

/**
 * Delete a post
 */
exports.destroy = function(req, res) {
    var post = req.post;
    post.remove(function(err) {
        if (err) {
            res.jsonp(500,{ error: err.message });
        } else {
            res.jsonp(post);
        }
    });
};

/**
 * Show a post by id
 */
exports.show = function(req, res) {
    res.jsonp(req.post);
};


/**
 * List of public posts
 */
exports.all = function(req, res) {
    Post.find().sort('-created').exec(function(err, posts) {
        if (err) {
           res.jsonp(500,{ error: err.message });
        } else {
            res.jsonp(200,posts);
        }
    });
};

 /* Post */
    var postController = require('../app/controllers/api/post');
    app.post('/api/post', postController.create);
    app.get('/api/post', postController.all);
    app.put('/api/post/:postId', postController.update);
    app.del('/api/post/:postId', postController.destroy);
    app.get('/api/post/:postId', postController.show);

    /* Post Param */
    app.param('postId', postController.post);

现在我需要另一条路线,例如 api/post/:slug

但我不知道该转向哪个方向,请给我一个提示,好吗? 使用 slug 而不是 id 管理可能是一种好方法吗?

喜欢

exports.post = function(req, res, next, slug) {
   Post.findOne({'slug': slug}, function (err, post) {
        if (err) {
            return next(err);
        }
        if (!post) {
            return next(new Error('Failed to load post ' + slug));
        }
        req.post = post;
        next();
    });
};

【问题讨论】:

  • 那行不通。 :postId:slug 只是变量名。路线保持不变。
  • 我的意思是使用 slug 而不是 id 总而言之我得到了 slug 的唯一性和索引
  • 如果:postId:slug不需要不同的路由,不知道你的问题是什么?只需对:slug 使用给定的路由即可。

标签: node.js rest express


【解决方案1】:

我正在做类似的事情...这是我的方法...

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; // Can be a slug or _id

    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 );
        }
    });
};

这有帮助吗?

【讨论】:

  • 是的,我不想避免这样的“混乱代码”,正如@Amberlamps 建议的那样[只需使用给定的路线 :slug 然后] 所以我使用 slug 而不是 _id - 谢谢你的意思跨度>
  • @Whisher 我实际上像你一样放弃了我上面提到的方法,觉得它太乱了。我还想消除使用 id 和 slug 的任何差异/混淆,所以我在这里想出了一个不同的解决方案:stackoverflow.com/questions/14555612/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
  • 2015-10-04
  • 2021-11-05
  • 1970-01-01
相关资源
最近更新 更多