2014-01-28 33 views
2

拿到後我有這個REST API:快遞REST由塞

'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的其他路線/後/:塞

但我不知道你能給我一個提示嗎? 可以用slu instead代替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(); 
    }); 
}; 
+0

這是行不通的。 ':postId'和':slug'只是變量名稱。路線保持不變。 – Amberlamps

+0

我的意思是使用slu instead代替所有的ID我有獨特的slu and和索引 – Whisher

+0

如果你不需要':postId'和':slug'的不同路由,我不知道你的問題是什麼?那麼只需使用給定的路線來「:slug」。 – Amberlamps

回答

3

Im做類似的東西...這裏是我的方法...

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

這是否幫助?

+0

是的,不是我想避免這樣一個'凌亂的代碼'和@Amberlamps建議[只需使用給定的路線:slug然後]所以我用slu instead代替_id - 感謝點 – Whisher

+0

@Whisher我實際上放棄了方法I如上所述,就像你一樣,感覺它太亂了。我也想刪除任何使用ID和slu disp的差異/混亂,所以我想出了一個不同的解決方案在這裏:http://stackoverflow.com/questions/14555612/how-to-fetch-a-backbone-js-模型由出頭,其他超的-ID/21417858#21417858 – DigitalJohn