Express 快车路线相互冲突

Express 快车路线相互冲突,express,meanjs,Express,Meanjs,我定义了以下快速路线: // Questions Routes app.route('/questions') .get(questions.list) .post(users.requiresLogin, questions.create); app.route('/questions/:questionId') .get(questions.read) .put(users.requiresLogin, questions.hasAuthorization

我定义了以下快速路线:

// Questions Routes 
app.route('/questions')
    .get(questions.list)
    .post(users.requiresLogin, questions.create);

app.route('/questions/:questionId')
    .get(questions.read)
    .put(users.requiresLogin, questions.hasAuthorization, questions.update)
    .delete(users.requiresLogin, questions.hasAuthorization, questions.delete);

app.route('/questions/list/:page')
            .get(questions.questionList);

app.route('/questions/count/')
            .get(questions.count);
与此
questionId
route参数的回调触发器一起:

app.param('questionId', questions.questionByID);
预期的行为是将
/questions/count
请求路由到控制器中的count方法,但它被路由到
questionByID
方法,我看到了以下错误:

CastError: Cast to ObjectId failed for value "count" at path "_id"
...
at exports.questionByID (/path/controllers/questions.server.controller.js:137:56)
...
我认为这是因为mongoose试图将文本“count”从路由转换为ObjectId类型,如果我使用
/questions/:questionId
路由,这是有意义的,但如果我使用
/questions/count
来发出请求,则没有意义

这是questions.server.controller.js中的两个相关方法

exports.count = function (req, res) {
    console.log('attempting to count these damn questions!');
    Question.count({}, function (err, count) {
        if (err) {
            return res.status(400).send({
                message: errorHandler.getErrorMessage(err)
            });
        } else {
            console.log(count);
            res.jsonp(count);
        }
    });
};

/**
 * Question middleware
 */
exports.questionByID = function (req, res, next, id) {
    Question.findById(id).populate('user', 'displayName').exec(function (err, question) {
        if (err) return next(err);
        if (!question) return next(new Error('Failed to load Question ' + id));
        req.question = question;
        next();
    });
};
我已将路线设置为:

app.route('/questionscount')
            .get(questions.count);
但这看起来很糟糕,我不想这样做,有人知道为什么会这样吗


提前感谢。

如果count和question \u id有差异,您可以将Regex放在route中以区分它们。

由于express以附加顺序评估路由,您应该首先放置更具体的路由。在您的示例中,它只计算“count”作为questionId参数,因为它与表达式匹配

如果将app.route('/questions/count/')路由放在
app.route('/questions/:questionId')应该可以用。

Hum。。你不是在电话里传递一个参数吗?我之所以问这个问题,是因为app.param定义了一个要在使用该参数的任何其他中间件之前执行的中间件。我没有向
/questions/count
调用传递任何参数,这就是为什么我不理解调用中间件的原因,好像它被解释为一个
/questions/:questionId
呼叫。你能在
questions.server.controller.js
中发布代码吗?我刚刚添加了相关的方法,如果你需要查看其他内容,请告诉我。这解决了路由问题,但我不明白原因,由于route参数被称为questionId而不是count.Response更新,请检查它是否满足您的求知欲。