如何将 ejs 与 json 数据一起使用?
How to use ejs with json data?
我想使用 json 读取我的视频,然后使用 ejs 显示它们,但出现错误:
>> 320| <% video.videos.forEach(function(video) { %>
video is not defined
我对 items.json 使用了相同的方法,我没有遇到这个问题,如果需要我可以上传显示项目的代码和 items.json。
HTML:
<ul class="splide__list">
<% video.videos.forEach(function(video) { %>
<li class="splide__slide">
<a href="<%= video.href %>" data-lity>
<img class="thumbnail" data-splide-lazy="<%= video.src %>" alt="<%= video.alt %>">
</a>
<p><%= video.desc %></p>
</li>
<% }) %>
</ul>
节点 js:
app.all('/', function (req, res) {
var items, videos;
//read shop items
fs.readFile('items.json', function (err, data) {
if (err) {
res.status(500).end();
} else {
items = JSON.parse(data);
}
});
// read videos
fs.readFile('video.json', function (err, data) {
if (err) {
res.status(500).end();
} else {
videos = JSON.parse(data);
}
});
res.render('index.ejs', {
items: items,
videos: videos
});
});
我的video.json:
{
"videos":[
{
"href":"media/video.mp4",
"src":"thumbnails/thumbnail2.png",
"alt":"video with 1",
"desc":"desc1"
},
{
"href":"media/video3.mp4",
"src":"thumbnails/thumbnail3.png",
"alt":"video with 2",
"desc":"desc2"
}
]
}
问题在于 fs.readFile
是异步的,而您调用 render
函数而不等待它们,因此您无法保证将内容读入内存。要解决此问题,您可以将 render
调用移至回调或使用 async/await
处理异步代码。我将向您展示 async/await
.
的示例
app.all('/', function (req, res) {
try {
const items = await fs.promises.readFile('items.json').then(JSON.parse);
const videos = await fs.promises.readFile('videos.json').then(JSON.parse);
res.render('index.ejs', { items, videos });
} catch (e) {
res.status(500).end();
}
});
是的,您传递的是 videos
,而在模板中您访问 video
变量,因此也将其更改为 videos
。
我想使用 json 读取我的视频,然后使用 ejs 显示它们,但出现错误:
>> 320| <% video.videos.forEach(function(video) { %>
video is not defined
我对 items.json 使用了相同的方法,我没有遇到这个问题,如果需要我可以上传显示项目的代码和 items.json。
HTML:
<ul class="splide__list">
<% video.videos.forEach(function(video) { %>
<li class="splide__slide">
<a href="<%= video.href %>" data-lity>
<img class="thumbnail" data-splide-lazy="<%= video.src %>" alt="<%= video.alt %>">
</a>
<p><%= video.desc %></p>
</li>
<% }) %>
</ul>
节点 js:
app.all('/', function (req, res) {
var items, videos;
//read shop items
fs.readFile('items.json', function (err, data) {
if (err) {
res.status(500).end();
} else {
items = JSON.parse(data);
}
});
// read videos
fs.readFile('video.json', function (err, data) {
if (err) {
res.status(500).end();
} else {
videos = JSON.parse(data);
}
});
res.render('index.ejs', {
items: items,
videos: videos
});
});
我的video.json:
{
"videos":[
{
"href":"media/video.mp4",
"src":"thumbnails/thumbnail2.png",
"alt":"video with 1",
"desc":"desc1"
},
{
"href":"media/video3.mp4",
"src":"thumbnails/thumbnail3.png",
"alt":"video with 2",
"desc":"desc2"
}
]
}
问题在于 fs.readFile
是异步的,而您调用 render
函数而不等待它们,因此您无法保证将内容读入内存。要解决此问题,您可以将 render
调用移至回调或使用 async/await
处理异步代码。我将向您展示 async/await
.
app.all('/', function (req, res) {
try {
const items = await fs.promises.readFile('items.json').then(JSON.parse);
const videos = await fs.promises.readFile('videos.json').then(JSON.parse);
res.render('index.ejs', { items, videos });
} catch (e) {
res.status(500).end();
}
});
是的,您传递的是 videos
,而在模板中您访问 video
变量,因此也将其更改为 videos
。