快速路线相互矛盾

时间:2015-08-09 00:24:50

标签: 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.update)
    .delete(users.requiresLogin, questions.hasAuthorization, questions.delete);

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

app.route('/questions/count/')
            .get(questions.count);

questionId路由参数的回调触发器:

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)
...

我认为这似乎是因为猫鼬正试图转换文字"计数"从路由到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);

但它看起来很糟糕,我不想这样做,有谁知道为什么会这样?

提前致谢。

2 个答案:

答案 0 :(得分:1)

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

如果你把app.route('/ questions / count /')路由放在之前 app.route('/ questions /:questionId')它应该可以工作。

答案 1 :(得分:0)

如果count和question_id有差异,你可以把Regex用于路由以区分它们