You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:06:56