使用EJS将数据从Node.js传递到HTML

4

这是我的服务器端代码:

app.set('view engine', 'html');
app.engine('html', require('ejs').renderFile);
app.use(express.static('views'));
app.use(bodyParser.urlencoded({extended:true}));
app.use(bodyParser.json());

app.get('/',function(req,res){
    var title = "PERFORMANCE OVERVIEW";
    res.render('Main.html',{name:title});
})

这是我的客户端代码(Main.html):

<div class="row">
    <div class="sm-col-12">
    <h3 contenteditable="true" style="font-family:BentonSans Medium; text-align:center; color:rgb(0,38,99);"><%= name %></h3>                    
    <hr style="border-top: dotted 2px;color:grey" />
    </div>
</div>

在Main.html页面上得到的输出是"<%-name%>",但实际应该打印"PERFORMANCE OVERVIEW"。这段代码有什么问题?
引用部分: 我忘了提到我也尝试了其他变量,如 <%= name%>{{ name }}。但我得到的输出分别是 "<%= name%>""{{ name }}"

这不应该是<%= name %>吗?乍一看,它看起来像是一个笔误,其中-代替了=-表示未转义(我想),但我怀疑你的意思不是这个。 - Neil Lunn
我也尝试过那个,但仍然得到<%= name%>作为输出,而不是“PERFORMANCE OVERVIEW”。 - Harsh kumar
你搞定了吗?如果我的回答没有帮助到你,你能否更新你的代码,以显示在你的app.js页面上的所有代码? - Lord Elrond
4个回答

7
更改为<%= name %> 应该解决这个问题。
如果还无法解决问题,您可以尝试将app.set('view engine', 'html')更改为app.set('view engine', 'ejs');,然后删除接下来的2行内容。
app.set('view engine', 'ejs');
app.use(bodyParser.urlencoded({extended:true}));
app.use(bodyParser.json());

app.get('/',function(req,res){
    var title = "PERFORMANCE OVERVIEW" ;
    res.render('Main',{name:title}) ;
});

我总是这样写的,因此无法确定您的语法是否正确,或者如果没有像这样设置,ejs是否会起作用。

更新

确保Main.html文件位于名为views的文件夹中,并将此文件重命名为Main.ejs

接下来将res.render('Main.html',{name:title});更改为res.render('main',{name:title});


嘿@Jane!我也尝试了你提到的更改。但是我仍然得到相同的输出。 - Harsh kumar
我找到了问题(我想)。请查看我的更新以获取答案。 - Lord Elrond
如果您想要自定义视图文件夹,也可以使用以下代码:app.set('views', path.join(__dirname, 'path', 'to', 'views')); - Lawrence Cherone
@Lawrence Cherone,我非常确定ejs将“views”文件夹设置为默认查找模板的位置,因为我从未使用过其他的。 - Lord Elrond
@Jane,更新的信息有效了!但现在我面临另一个问题。我有另一个 .html 页面。当点击按钮时,它使用 window.location.href 在这两个 html 页面之间切换。但是现在由于我将 Main.html 更改为 Main.ejs,它正在下载 .ejs 文件而不是显示它。如何通过 JavaScript 处理 .ejs 文件? - Harsh kumar
@Harshkumar,你能否更新一下你的问题并附上相关代码?我不确定你需要什么。如果你只是想使用<a href="/somePage">,那么你需要在你的app.js中设置一个/somePage的路由。 - Lord Elrond

2
<%- Outputs the unescaped value into the template
<%= Outputs the value into the template (HTML escaped)

你想打印值,可以使用<%=标签,所以将<%- name%>更改为<%= name%>
相关信息可以在这里找到:https://ejs.co/#docs

我也尝试过那样做,但仍然得到<%= name%>作为输出,而不是“PERFORMANCE OVERVIEW”。 - Harsh kumar

0

在你的Main.html中将<%- name%>更改为<%= name%>


我也尝试过那个,但仍然得到<%= name%>作为输出,而不是“PERFORMANCE OVERVIEW”。 - Harsh kumar

0
const express = require('express');
const bodyParser = require('body-parser');

const port = 5000;

const app = express();

app.set('view engine', 'html');
app.engine('html', require('ejs').renderFile);
app.use(express.static('views'));
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

app.get('/', function (req, res) {
  var title = "PERFORMANCE OVERVIEW";
  res.render('Main.html', { name: title });
});

app.listen(port, console.log(`Server is running on port ${port}`))

尝试这个,它可以呈现HTML页面并访问您传递的变量。


嘿@shareyar!我也尝试了你提到的上述更改,但仍然得到相同的输出。 - Harsh kumar
请检查我的更新代码版本,希望它能为您工作。 - Muhammad Shareyar
请问您在这段代码中添加了什么新内容?我也在我的代码中添加了require语句和“listen”路由处理程序。如果我将Main.html转换为Main.ejs,我的代码就可以运行了。但是有没有不将它更改为.ejs文件的方法呢? - Harsh kumar
这里不需要将您的文件更改为EJS格式,您可以访问您的HTML文件中的数据。 - Muhammad Shareyar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接