Javascript 路由问题,未收集请求参数
我正在为一个项目制作一个维基百科克隆。我的初始编辑路线如下所示:Javascript 路由问题,未收集请求参数,javascript,node.js,express,mongoose,Javascript,Node.js,Express,Mongoose,我正在为一个项目制作一个维基百科克隆。我的初始编辑路线如下所示: router.get('/edit/:id', function(req, res){ var id = req.params.id; console.log(id); models.Page.findById(id, function(err, doc){ console.log(doc); res.render('edit', {page: doc}); })
router.get('/edit/:id', function(req, res){
var id = req.params.id;
console.log(id);
models.Page.findById(id, function(err, doc){
console.log(doc);
res.render('edit', {page: doc});
});
});
我所做的只是为一个id为id参数的页面创建一个编辑页面视图。
直到
我不得不添加这条新路线:
router.get('/:url_name/:id', function(req,res){
var id = req.params.id;
models.Page.findById(id, function(err, doc){
res.render('show_page', {page: doc});
});
});
现在,当我激活这个路由时,我的edit/:id页面路由不会收集id参数(req.params.id)
我不知道为什么这不起作用,也不知道应该从哪里开始调试,因为我没有收到任何错误,它仍然会将我带到我的编辑/:id页面,但当我控制台.log(id)时,我没有收到任何值,甚至没有收到任何未定义的值。此外,找不到我传递给编辑视图的{page:doc}
如果有人能提供见解或一个开始寻找调试的地方,我将不胜感激。只是提醒一下,当我没有激活:url\u name/:id路由时,edit/:id路由将按它应该的方式工作(req.params.id获取id)
现有路线-
我添加了var wiki_routes=require('./routes/wiki')代码>在我的app.js中,在该路径中,我有:
// **** URL ROUTES ****
router.get('/', function(req, res) {
models.Page.find(function(err, docs) {
res.render('index', { docs: docs });
});
});
router.get('/:url_name', function(req, res){
var url_name = req.params.url_name;
var isUpdated = req.query.updated;
var updated = (isUpdated === 'true')?true:false;
models.Page.find({url_name: url_name}, function(err, page){
if(page.length > 1){
console.log(page);
res.render('disambiguation', {pages: page, updated: updated });
} else {
console.log(page);
res.render('show_page', {page: page[0], updated: updated});
}
});
});
router.get('/:url_name/:id', function(req,res){
var id = req.params.id;
models.Page.findById(id, function(err, doc){
res.render('show_page', {page: doc});
});
});
// **** EDIT ROUTES ****
router.get('/edit/:id', function(req, res){
var id = req.params.id;
console.log(id);
models.Page.findById(id, function(err, doc){
console.log(doc);
res.render('edit', {page: doc});
});
});
router.post('/edit_submit/:id', function(req, res){
var id = req.params.id;
var new_title = req.body.title;
var new_body = req.body.body;
console.log(req.body);
models.Page.findByIdAndUpdate(id, {title: new_title, body: new_body }, function(err, docs){
// redirects to the wiki page
res.redirect('/wiki/'+ docs.url_name +'?updated=true');
});
});
// **** DELETE ROUTE ****
router.get('/delete/:id', function(req, res){
var id = req.params.id;
models.Page.findByIdAndRemove(id, function(err, data){
res.redirect('/?deleted=true');
});
});
路由是在代码中出现时设置的,因为节点将显示它首先遇到的任何路由,所以在设置路由时,顺序非常重要。
一个URL可能会匹配多个路由,特别是在使用捕获大量不同URL的变量或静态路由等时
在你的例子中,你有一个URL
该URL肯定会被此路由捕获
router.get('/:url_name/:id' ....
因为它与http://example.com/something/something
layout,它也会被以下路径捕获
router.get('/edit/:id', ....
因为它与http://example.com/edit/something
布局
哪个路由实际包含URL取决于它们在设置时遇到的顺序,无论哪个首先声明的路由都将捕获URL
在大多数情况下,只要改变路线的顺序就可以解决这样的问题
// if the URL matches, this will execute first
router.get('/edit/:id', function(req, res){
// do stuff
});
// You'll only get here if the URL doesn't match the above route
router.get('/:url_name/:id', function(req, res){
// do stuff
});
router.get('/:url_name/:id', function(req, res, next){
if ( req.params.url_name == 'edit' ) {
next(); // this sends the request back to look for routes below this one
}else{
// do stuff
}
});
router.get('/edit/:id', function(req, res){
// now we'll get here when the "url_name" is "edit" ...
});
如果您无法使用next()
回调来交换路由,那么有一种解决方法,如下所示
// if the URL matches, this will execute first
router.get('/edit/:id', function(req, res){
// do stuff
});
// You'll only get here if the URL doesn't match the above route
router.get('/:url_name/:id', function(req, res){
// do stuff
});
router.get('/:url_name/:id', function(req, res, next){
if ( req.params.url_name == 'edit' ) {
next(); // this sends the request back to look for routes below this one
}else{
// do stuff
}
});
router.get('/edit/:id', function(req, res){
// now we'll get here when the "url_name" is "edit" ...
});
你把新路线放在编辑路线之前了吗?如果是这样的话,它会抓住所有的东西。Hey adeneo,我不太清楚你在编辑路线之前所说的“新路线”是什么意思。以下是我从my/wiki路由器的所有路由。我把它们添加到我的问题中。交换位置,移动router.get(“/:url_name/:id”…
在编辑
路线之后,不要抓住编辑的url”这样做,把所有路线放在最后,否则他们会做他们应该做的事情,抓住一切。哇,非常感谢@adeneo。你知道任何资源或者这个“路线捕捉”指的是什么吗?我是一个开发新手d这是我的第一个项目。我不知道会发生这种情况,而且在路由器中创建路由时顺序很重要。此外,我很乐意为您的答案提供支持。请作为答案发布,以便我:)