当前位置: 首页 > 知识库问答 >
问题:

EJS噩梦-不能包含外部视图

黎玺
2023-03-14

在EJS中包含外部文件似乎从来没有一种简单的方法。

我的项目结构是这样的。如此简单却让人心痛:

/lib/ejs-template.ejs

/views/home.ejs
/views/header.ejs

home.ejs内部,我必须包含header.ejs。我很幸运地遵循了他们的文档:https://ejs.co/#docs并以这种方式包含文件,因为“include相对于包含调用的模板”,

<%- include("header") %>

ejs-template.ejs中,我像这样编译模板:

module.exports = (target, vars = {})=>{
    return Ejs.compile( Fs.readFileSync(`${__dirname}/../views/${target}.ejs`, {encoding: 'utf-8'}), {
        views: [ Path.resolve('../views') ],
    })(vars)
}

但我却犯了这个错误!

Error: ejs:38
    36| <body>
    37|
 >> 38| <%- include("header") %>
    39|
    40| <main class="container">
    41|     <h4>Some stuff</h4>

Could not find the include file "header"
    at getIncludePath ([redacted]\server\node_modules\ejs\lib\ejs.js:183:13)
    at includeFile ([redacted]\server\node_modules\ejs\lib\ejs.js:309:19)
    at include ([redacted]\server\node_modules\ejs\lib\ejs.js:690:16)
    at eval (eval at compile ([redacted]\server\node_modules\ejs\lib\ejs.js:662:12), <anonymous>:12:17)
    at anonymous ([redacted]\server\node_modules\ejs\lib\ejs.js:692:17)
    at module.exports ([redacted]\server\util\ejs-template.js:13:7)
    at [redacted]\server\route\site.js:13:18
    at Layer.handle [as handle_request] ([redacted]\server\node_modules\express\lib\router\layer.js:95:5)
    at next ([redacted]\server\node_modules\express\lib\router\route.js:137:13)
    at module.exports ([redacted]\server\middleware\isLoggedIn.js:8:9) {
  path: ''
}

我已经在编译选项中设置了视图路径。我试过有路/无路。我还尝试在相同的视图路径上设置root

我错过了什么?文件是松散的,没有提供有关这一点的线索。

共有2个答案

席乐童
2023-03-14

据我所知,您面临的问题是在主视图文件中包含页眉部分。我使用了下面的代码。

<body>
    <%- include("header"}) %>
    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>
    <button>Button</button>
</body>

上面的脚本是home.ejs,您可以创建header.ejs。您可以包括上面这样的内容

楚钊
2023-03-14

看来是路径问题。我不得不这样设置:

views: [ Path.resolve(__dirname, '../views') ],

欢迎https://github.com/mde/ejs/issues/594#issuecomment-812518617

 类似资料:
  • 问题内容: 好的,这很荒谬:(或者我的设计可能是:) 以下是我们使用的URL: 现在有趣的部分: 如果代码按上述顺序排序,则调用将使用wallName路由到第一条路由!从而得到405。 如果我将其移到底部,则可以正确路由! 现在,这就是我所知道的: Restlet中的默认路由模式是MODE_FIRST_MATCH。我将其设置为MODE_BEST_MATCH,URL的顺序仍然很重要!我无法访问“相似

  • 问题内容: 我正在尝试使用Nightmare抓取网页,但要等到它实际存在时才等待出现。否则,我希望梦Night继续前进。如何使用来完成? 我不能用。使用手段,噩梦将一直等待直到该元素出现,但如果页面永远不会包含此元素,则噩梦将永远等待。 最后一个选项是使用。我尝试过这样的事情 因此,请等待并再次尝试(达到阈值),如果找不到该元素,则继续前进。setTimeout周围的代码似乎错误,因为它是在浏览器

  • 问题内容: 我正在尝试将嵌入式Javascript渲染器用于节点:https : //github.com/visionmedia/ejs 我想知道如何在.ejs视图文件中包含另一个视图文件(部分)。 问题答案: 使用Express 3.0: 路径是相对于包含文件的调用者的相对路径,而不是相对于通过设置的views目录的相对路径。 EJS包括 (更新:ejs v3.0.1的最新语法是)

  • 问题内容: 我找不到将外部.js文件包含到Node ejs模板中的方法。我想将逻辑和数据放入外部.js文件中的对象中,将该文件包含到index.ejs模板中并从中提取数据。 我尝试通过插入标准方式尝试 ,但它不起作用 然后,我尝试了ejs特定关键字,这仅适用于添加部分内容(ejs代码段)。 我将.js文件插入了在可执行server.js中定义的静态目录中,再次没有结果。 但有趣的是,例如,将css

  • 问题内容: 我有两个包。我要从第一个包中导入的类声明为PUBLIC。尽管如此,当我从第二个软件包测试文件时,它向我显示了如下编译错误: PUBLICclass在mypackage中不是公共的;无法从外部包访问 我试图从第一个程序包中向该类添加一个公共构造函数,但没有任何区别。 你有什么想法?我使用Netbeans 7。 第一个包中的类如下所示: 问题答案: 让我猜猜 您最初的课堂声明不是公开的,然

  • 我们正在两个不同的实例上运行云服务。这个云服务在服务总线队列上旋转一个接收器。此接收器配置为:1。窥视并锁定模式2。自动完成=真3。RenewLockTimeout=10分钟4。MaxConcurrentMessages=1 5。PrefetchCount=默认值(应为0) 几天前,Azure决定更新我们的实例。我从日志中看到,在18.18时,第一个实例被请求停止。在18.24时,该实例停止,并在