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。我什至不知道我可以提供哪些其他有用的细节,同时仍然保持它的最小示例。 我刚刚注意到,这不应该是<%= include('elements/fbviewpagepixel.ejs') %>
而不是<%- include('elements/fbviewpagepixel.ejs') %>
吗?
EJS 在版本更新中是否放弃了对<%- include('…') %>
这种写作风格的支持?你使用不同的 EJS 版本吗?快速浏览文档后,这种风格似乎是当前风格:<%- include elements/fbviewpagepixel.ejs %>
。您的“页面”是不同的项目还是只是不同的路线/网址?
@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 包含不是函数错误的主要内容,如果未能解决你的问题,请参考以下文章