gpt4 book ai didi

javascript - 路由问题,不收集 req.params

转载 作者:行者123 更新时间:2023-11-30 17:27:58 25 4
gpt4 key购买 nike

我正在为一个项目制作维基百科克隆。我的初始编辑路线如下所示:

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

});

我所做的只是为页面创建一个编辑页面 View ,该页面具有与 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)。

我不知道为什么这不起作用以及我应该从哪里开始尝试调试,因为我没有收到任何错误,它仍然会带我到我的 edit/:id 页面,但是当我 console.log(id ) 我没有收到任何值,甚至没有收到任何未定义的值。此外,没有找到我传递给编辑 View 的 {page:doc}。

如果有人可以提供见解或开始寻找调试的地方,我将不胜感激。提醒一下,当我没有激活 :url_name/:id 路由时,edit/:id 路由正常工作(req.params.id 获取 id)。

当前路线 -

我在我的 app.js 中添加了 var wiki_routes = require('./routes/wiki'); 并且在该 route 我有:

// **** 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');
});
});

最佳答案

路由是在代码中出现时设置的,因为 Node 会优先考虑它首先遇到的路由,因此在设置路由时,顺序非常重要
一个 URL 可能会匹配多个路由,尤其是在使用捕获大量不同 URL 或静态路由等的变量时。

假设你有一个 URL 看起来像

http://example.com/edit/1234

该 URL 很可能会被这条路由捕获

router.get('/:url_name/:id' ....

因为它匹配 http://example.com/something/something 布局,它也会被下面的路由捕获

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

如果您根本无法交换路由,可以使用 next() 回调,就像这样

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" ...
});

关于javascript - 路由问题,不收集 req.params,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23847610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com