Express/Jade中的相关链接

Express/Jade中的相关链接,express,pug,Express,Pug,我正试图让我的Jade模板相对于当前URL编写超链接() 例如,我的视图是从http://localhost/cats它看起来是这样的: extends layout block content a(href='fluffy') Fluffy 单击链接时,我会进入http://localhost/fluffy,而不是http://localhost/cats/fluffy 我尝试过的事情: a(href='./fluffly') a(href='\\fluffy') a(href='/

我正试图让我的Jade模板相对于当前URL编写超链接(

例如,我的视图是从
http://localhost/cats
它看起来是这样的:

extends layout

block content
  a(href='fluffy') Fluffy
单击链接时,我会进入
http://localhost/fluffy
,而不是
http://localhost/cats/fluffy

我尝试过的事情:

  • a(href='./fluffly')
  • a(href='\\fluffy')
  • a(href='/fluffy')

唯一有效的方法就是写出绝对路径,比如
a(href='cats/fluffy')
。当然还有更好的方法。

正如您已经注意到的,当您打开
/cats
时,可以预期到
fluffy
的相对链接将引导您找到
/fluffy
:)

背景信息:Express的默认行为是将
/cats
/cats/
视为相同,并且两者将触发相同的路由

在创建链接(尤其是相对链接)时,您必须考虑到这一点,或者告诉Express将其视为两条单独的路线:

app.enable('strict routing');

app.get('/cats/', function(req, res) {
  ...
});

这将匹配
/cats/
,但不匹配
/cats
。当然,当您在路线定义中省略尾随斜杠时,此行为将被反转。

如果您使用的是
gulp jade
,请将
gulp data
添加到混合中并使用此代码:

var jade=require('gulp-jade');
var数据=需要('gulp-data');
gulp.src(“**.jade”)
.pipe(数据)(函数(文件){
var relativePath=file.history[0]。替换(file.base.);//例如about/index.jade
var depth=(relativePath.match(//\//g)| |[])长度;//例如1
var relativeRoot=新数组(深度+1).join(“../”);//例如/
返回{
relativeRoot:relativeRoot
};
}))
.pipe(jade())
这将在
jade
模板中为您提供一个
relativeRoot
,该模板本质上是:
。/
重复次数与它相对于基本文件夹嵌套的目录数相同

然后,在模板中:

链接(rel='stylesheet',href=relativeRoot+'assets/main.css')

我不完全确定该
文件的位置/如何生成。历史记录
,但在我的例子中,
[0]
指向原始文件名(其绝对路径在磁盘上)

我无法复制它,所以你确定你没有打开
/cats
?默认情况下,Express不关心后面的斜杠,并且将
/cats
/cats/
视为相同的(因此它们都将触发相同的路由)。是否使用
标记?如果是,价值是多少?@robertklep我肯定@gustavohenke我没有使用
标记。。也许我应该。事实上,我刚刚检查了HTML输出,它正确地显示为
,即使当前页面是@Travis,我希望这是一个打字错误
localhost/cats
(不带尾随斜杠)@robertklep-Oops。。你想加上这个作为回答,我会接受的:-)聪明!对我来说效果很好。尽管如此,我还是确保对此进行了评论,因为这不是我所期望的方法,而且从模板的角度来看,
relativeRoot
变量似乎不知从何而来。对于那些希望所有URL都是相对的,即使深度为0的人:
var relativeRoot=depth==0?“/”:新数组(深度+1).join(“../”)