【问题标题】:Express JS routes issue. Returns 404 when accessing resource with subpaths and params in the middleExpress JS 路由问题。访问中间有子路径和参数的资源时返回 404
【发布时间】:2014-12-10 23:42:33
【问题描述】:

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

来自参数但无法继续:

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

【问题讨论】:

  • 您的teams.teamByID 是什么样的?你的其他路线有效吗?
  • @mscdex 我提供了上面的 teams.teamByID 实现
  • 你的/teams/:teamId 路由工作正常吗?
  • teamByID() 到达您获得 404 的路线时,err 是否设置或 !team 为真?
  • 另外,您可以尝试在使用 :teamId 的路线之前移动您的 app.param('teamId', teams.teamByID);

标签: node.js express mean-stack meanjs


【解决方案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 handler 有这个签名:param(req, res, callback, value, key)

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

路由(req, res, next)

路由(错误、请求、资源、下一个)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      • 2021-08-24
      • 1970-01-01
      • 1970-01-01
      • 2017-06-09
      • 2021-10-28
      • 1970-01-01
      相关资源
      最近更新 更多