Express JS路线问题。访问具有子路径和中间的参数的资源时返回404

时间:2014-12-05 13:31:41

标签: node.js express mean-stack meanjs

我正在使用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();
    });
};

2 个答案:

答案 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。它将您的控制器/中间件分开。 :)