【问题标题】:Error ejs is not defined?错误ejs未定义?
【发布时间】:2018-06-28 07:53:50
【问题描述】:

我正在使用 ejs,并且我有以下代码。

app.get('/profile/:name',function(req,res){
var data={
age: 29,
job:'ninja'
 };
 var ejsData={
data:data,
person:req.params.name
};
res.render('profile',ejsData);
});

使用以下ejs文件

<!doctype html>
<html>
<head>
<style>
body{background: skyblue;font-family: verdana;color: #fff;padding: 
30px;}
h1{font-size: 48px;text-transform: uppercase;letter-spacing: 2px;text- 
align: center;}
p{font-size: 16px}


</style>
</head>
<body>
<h1>Profile Page <%= ejsData.person %></h1>
<p>The Age of the Person is <%= ejsData.data.age %> </p>
<p>He works as a <%= ejsData.data.job %> </p>
</body>
</html>

但是我一直收到这个错误?我在做什么错?

【问题讨论】:

    标签: javascript node.js compiler-errors ejs


    【解决方案1】:

    引用传递给模板的对象的属性,而不是对象本身,即

    <h1>Profile page <%= person %>
    <p>The age of the person is <%= data.age %> </p>
    ...
    

    如果您想直接引用该对象,则需要将其作为属性传递

    res.render("profile", { ejsData }):
    

    【讨论】:

    • 是否有不能传入对象本身的原因?
    • @akotch 你可以,我已经向你展示了如何做到这一点的例子。就以您当前拥有的方式访问对象而言,模板无法知道如何命名它,因此对于一致的 API,公开属性是有意义的。
    • 如果我将 ejsdata 作为全局对象而不是本地对象传递,它是如何工作的?
    • @akotch 它是相同的解决方案,只是掩码不同,全局变量附加到 global 对象,因此实际上它们成为该对象的属性。 EJS 很可能首先检查本地范围(即通过渲染传递的数据),然后检查 global 对象。
    【解决方案2】:

    为了匹配 ejs 网页快速入门示例的约定,更改您对 render 的调用以使 ejsData 成为传入对象的属性:

    res.render('profile', {ejsData: ejsData}); 
    

    可能更简洁一些,并且可能更好地说明正在发生的事情,只需从您的 ejs 文件中删除字符串“ejsData”(不要更改 res.render 调用):

    <!doctype html>
    <html>
    <head>
    <style>
    body{background: skyblue;font-family: verdana;color: #fff;padding: 
    30px;}
    h1{font-size: 48px;text-transform: uppercase;letter-spacing: 2px;text- 
    align: center;}
    p{font-size: 16px}
    
    
    </style>
    </head>
    <body>
    <h1>Profile Page <%= person %></h1>
    <p>The Age of the Person is <%= data.age %> </p>
    <p>He works as a <%= data.job %> </p>
    </body>
    </html>
    

    由于您的代码在您的帖子中,ejsData 只是传递给渲染的变量的名称。你给它的 render 函数和 ejs 模板不会知道关于那个变量名的任何东西(除非你把它作为你传入的对象的属性,就像在第一个例子中一样)。

    【讨论】:

    • 如果我将 ejsData 作为一个全局对象传递它会如何工作? ejsData={ 数据:数据,人:req.params.name };
    • 不确定您的意思。你能用整个 JavaScript 代码发布这个更改吗?
    猜你喜欢
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多