EJS 包含不是函数错误

Posted

技术标签:

【中文标题】EJS 包含不是函数错误【英文标题】:EJS include is not a function Error 【发布时间】:2017-11-03 13:35:14 【问题描述】:

在我的许多 EJS 页面上,我都有以下代码:

<%- include('elements/fbviewpagepixel.ejs') %>

除了这一页外,它工作得很好。在那一页上,它给了我一个错误,说include is not a function。看来我可以通过将上面的代码更改为以下内容来修复它:

<%- include elements/fbviewpagepixel.ejs %>

为什么第一个版本可以在我的所有页面上运行,除了这个?为什么它在这一页上给我一个错误?两者有什么区别?

【问题讨论】:

如果我们对这两个页面一无所知,很难回答! @pds42 老实说,我不确定还有哪些其他细节是相关的。试图确保我提供minimal example。我什至不知道我可以提供哪些其他有用的细节,同时仍然保持它的最小示例。 我刚刚注意到,这不应该是&lt;%= include('elements/fbviewpagepixel.ejs') %&gt; 而不是&lt;%- include('elements/fbviewpagepixel.ejs') %&gt; 吗? EJS 在版本更新中是否放弃了对&lt;%- include('…') %&gt; 这种写作风格的支持?你使用不同的 EJS 版本吗?快速浏览文档后,这种风格似乎是当前风格:&lt;%- include elements/fbviewpagepixel.ejs %&gt;。您的“页面”是不同的项目还是只是不同的路线/网址? @michelgotta 不,我应该始终使用相同的版本。总的来说只是超级奇怪的行为。我只是好奇它为什么会这样。 【参考方案1】:

我也有同样的问题;我通过删除我的 node_modules 文件夹并运行全新的 > npm install 来解决它。

希望我能准确地告诉你为什么修复了这个问题,但是我从出现这个错误到后来一切正常。

【讨论】:

我可以告诉你发生了什么:安装了一个不同版本的 EJS 引擎,它不支持包含函数字面量。在此页面中查看我的答案。【参考方案2】:

我认为,这个问题来自列表中传递的参数。 我在呈现我的用户时遇到了同样的问题:

res.render("profil-client.ejs", 
    client: myClient
);

但是当我像这样重命名我的参数时:

res.render("profil-client.ejs", 
    r_client: myClient
);

没有更多错误。我不确定,但我认为 ejs 将属性“client”用于内部使用。所以我只是重命名我的参数...

【讨论】:

我可以确认这一点,传递客户端也是造成我问题的原因,ejs 版本 "ejs": "^2.6.1",【参考方案3】:

在EJS的后续版本中,“client”参数键是保留的,因此会导致这个错误。重命名密钥,它将解决您的问题。

【讨论】:

客户端参数键?这个问题到底在哪里引用? 它没有,但这通常是导致所描述问题的原因。解决方案有帮助吗? 为我工作。 EJS 有一个特性,它从 express 继承设置,合并到传递给 renderFile 的数据对象中。如果您不希望它这样做,只需传递一个空对象作为附加参数:renderFile(fileName, data, /* don't merge options */) 谢谢,这应该记录在错误消息中。 呃!我花了很多时间把头发拉出来。谢谢!【参考方案4】:

除了其他两个答案中提到的 EJS 错误(参数命名错误的问题以及有关包含函数的消息)之外,不同的 EJS 版本肯定存在问题。

在我的项目设置中,我有以下包:

"ejs": "^3.1.6",
"ejs-webpack-loader": "^2.2.2",

当我使用ejs 和快速服务器根据每个用户请求即时编译模板时,语法必须是:

<%- include('elements/fbviewpagepixel.ejs') %>

当我使用ejs-webpack-loader 来预编译要由 Apache Web 服务器提供服务的静态文件时,语法必须是:

<%- include elements/fbviewpagepixel.ejs %>

我还没有检查 Webpack 加载器到底使用了哪个 EJS 版本,但我认为它一定与 v3 不同。

【讨论】:

以上是关于EJS 包含不是函数错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在渲染 ejs 视图 Node.js 时捕获错误

设置 EJS 项目时出现问题

res.render() 不渲染 ejs 文件,没有抛出错误 node.js app

EJS 包含在单独的 ejs 文件中定义的函数

错误:找不到模块“ejs”

Webpack + Express + EJS:错误:找不到模块“。”