0

我正在使用 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

我想知道在定义路线时我是否做错了什么,以及是否有更好的方法来定义路线。

先感谢您。


编辑@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();
    });
};
4

2 回答 2

1

我在这里发现了问题。我深入研究了 express 代码并检查了它如何处理其路线。

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

它将使用其 Layer 类的“handle_error”,传递四个参数:error、req、res 和 next。

如果路由的参数少于 4 个,它将使用它的 Layer 类的 'handle_request' 方法,传递 3 个主要参数:req、res、next。所以更正我的“teamParticipants”方法,我应该有这种实现让它工作:

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 和 route 传递了相同的参数。

参数处理程序具有以下签名:param(req, res, callback, value, key)

这与路由路由的处理程序签名不同:

路线(请求,资源,下一个)

路线(错误,请求,资源,下一个)

于 2014-12-10T15:42:33.763 回答
0

我一直在使用这个 npm 模块expresspath。它将您的控制器/中间件分开。:)

于 2014-12-06T12:00:18.150 回答