Node.js 特快专递
我有一个rest api:Node.js 特快专递,node.js,rest,express,Node.js,Rest,Express,我有一个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(
'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);
}
});
};
与
现在我需要另一条路线,比如
api/post/:slug
但是我不知道该往哪个方向转,你能给我一个提示吗?
使用slug而不是id是一种很好的管理方法吗
像
我也在做类似的事情。。。这是我的方法
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 );
}
});
};
这有用吗?那不行<代码>:postId和
:slug
只是变量名。路线保持不变。我的意思是使用slug而不是id all。我得到了唯一的slug和INDEXI。如果您不需要为:postId
和:slug
使用不同的路线,我不知道您的问题是什么?只需为:slug使用给定的路由即可。是的,也不是。我想避免这样一个“混乱的代码”,正如@Amberlamps所建议的[只需为:slug使用给定的路由即可],因此我使用slug而不是_id-感谢您的帮助point@Whisher我实际上放弃了我上面提到的方法,就像你一样,觉得它太乱了。我还想消除ID和SLUG使用中的任何差异/混淆,因此我在这里提出了一个不同的解决方案:
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();
});
};
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 );
}
});
};