快递路线有冲突
Express routes are conflicting
我定义了以下快速路线:
// 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
请求路由到控制器中的计数方法,但它被路由到 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_id有区别可以把Regex放在route中区分
由于 express 按附加顺序评估路线,因此您应该将更具体的路线放在第一位。在您的示例中,它只是将 "count" 评估为 questionId 参数,因为它与表达式匹配。
如果你把 app.route('/questions/count/') 路线放在
app.route('/questions/:questionId') 它应该有效。
我定义了以下快速路线:
// 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
请求路由到控制器中的计数方法,但它被路由到 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_id有区别可以把Regex放在route中区分
由于 express 按附加顺序评估路线,因此您应该将更具体的路线放在第一位。在您的示例中,它只是将 "count" 评估为 questionId 参数,因为它与表达式匹配。
如果你把 app.route('/questions/count/') 路线放在 app.route('/questions/:questionId') 它应该有效。