我正在使用meanjs的MEAN堆栈并拥有这条路线:
// Teams Routes
app.route('/teams')
.get(teams.list)
.post(users.requiresLogin, teams.create);
app.route('/teams/:teamId')
.get(teams.read)
.put(users.requiresLogin, teams.update)
.delete(users.requiresLogin, teams.delete);
app.route('/teams/:teamId/participants')
.get(teams.teamParticipants);
// Finish by binding the Team middleware
app.param('teamId', teams.teamByID);
这里的问题是,每当我使用此路径访问资源时:
[GET]
http://localhost:3000/teams/547dd53b964b3514294d2dfe/participants
它始终返回404状态。当请求到达服务器时,它正在访问
teams.teamByID
来自param,但未能继续:
teams.teamParticipants
我想知道在定义我的路线时是否有错误,以及是否有更好的方法来定义路线。
提前谢谢。
EDITS
@mscdex
这是我的teamByID
exports.teamByID = function(req, res, next, id) {
Team.findById(id).exec(function(err, team) {
if (err) return next(err);
if (! team) return next(new Error('Failed to load Team ' + id));
req.team = team ;
next();
});
};
答案 0 :(得分:1)
我在这里发现了问题。我深入了解快递'代码并检查它如何处理其路由。
Express根据函数的参数个数处理路由回调。
如果路线的功能有四(4),就像我的那个:
exports.teamParticipants = function(req, res, next, id) {
Participant.find({team: id}, function(err, participants){
if (err) return next(err);
if (! participants) return next(new Error('Failed to load Participants from Team ' + id));
res.jsonp(participants);
next();
});
};
它会使用它的' handle_error'它的Layer类,传递四个参数:error,req,res和next。
如果路由的参数少于4个,则使用' handle_request'它的方法是Layer类,传递3个主要参数:req,res,next。所以纠正我的团队参与者'方法,我应该有这种实现方式:
exports.teamParticipants = function(req, res) {
Participant.find({team: req.team._id}, function(err, participants){
if (err){
return res.status(400).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.jsonp(participants);
}
});
};
到目前为止,这里的问题是Express处理param和路由不同。我认为param和route传递了相同的论点。
param handler有这个签名: param(req,res,callback,value,key)
与路线不同 route的处理程序签名:
路线(req,res,next)
路线(错误,请求,res,下一步)
答案 1 :(得分:0)
我一直在使用这个npm模块expresspath。它将您的控制器/中间件分开。 :)