Router.get请求错误定位资源目录,其他页面功能正常
解决路由
/edit/(:id)下资源路径错误的问题 看起来你遇到的是相对路径在嵌套路由下的基准路径错误问题——当访问/edit/123这种带层级的路由时,浏览器会把当前URL的路径/edit/当成相对路径的基准,所以原本指向/assets的资源请求就变成了/edit/assets,这和路由本身的设置无关,是浏览器处理相对路径的机制导致的。
下面给你几个快速解决的方案:
1. 改用绝对路径引用资源
这是最直接的办法:把页面里所有资源(CSS、JS、图片)的引用路径改成以/开头的绝对路径。比如:
- 把
<link rel="stylesheet" href="assets/css/style.css"> - 改成
<link rel="stylesheet" href="/assets/css/style.css">
这样不管当前路由是什么层级,浏览器都会从网站根目录开始查找/assets下的资源。
2. 设置<base>标签统一基准路径
在你的页面模板的<head>里添加一个<base>标签,指定所有相对路径的基准为根目录:
<head> <base href="/"> <!-- 其他head内容 --> </head>
这样所有相对路径的资源引用、甚至页面跳转的相对链接,都会自动以/为基准,不用一个个修改路径。不过要注意:如果你的页面里有相对路径的跳转链接(比如../),可能需要调整,因为<base>会改变所有相对路径的解析规则。
3. 模板引擎统一配置资源路径(如果使用的话)
如果你用了EJS、Pug这类模板引擎,可以在渲染页面时传入一个统一的资源路径变量,比如在你的路由代码里:
router.get('/edit/(:id)', function(req, res, next){ var o_id = new ObjectId(req.params.id) db.collection('projects').find({"_id": o_id}).toArray(function(err, result) { if(err) return next(err); // 传入资源根路径变量 res.render('edit', { project: result[0], assetRoot: '/' }); }); });
然后在模板里用这个变量拼接路径:
<!-- EJS示例 --> <link rel="stylesheet" href="<%= assetRoot %>assets/css/style.css">
为什么其他GET路由没问题?
因为其他GET路由可能是根路径(比如/)或者单层级路径(比如/list),此时相对路径的基准就是/,所以资源请求会正确指向/assets;而/edit/(:id)是两层级路径,基准变成了/edit/,就出现了路径错误。
内容的提问来源于stack exchange,提问作者Jacob Staggs
相关产品推荐
相关产品推荐

