как вы просили в комментариях, это мой способ сделать это:
У меня есть папка "views" в проекте, включая эти папки внутри:
и динамические c e js файлы рядом с ними
Допустим, мы хотим отобразить этот макет, который имеет заголовок на каждой странице, но с другим телом:
layout:
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<% for (let cssLink of cssLinks) { %>
<link rel="stylesheet" href="<%= cssLink %>" />
<% } %>
<title>home page</title>
</head>
<body>
<h1>THIS IS HEADER!</h1>
<div id="demo">
<%- mainView %>
</div>
</body>
</html>
вы можете видеть, что есть переменная mainView
в теле, поэтому давайте посмотрим, как мы можем вставить наше тело Dynami c:
У меня есть функция внутри моего папка утилит, которая уменьшает повторение кода:
const ejs = require('ejs');
const path = require('path');
const layoutsPath = path.join(__dirname, "./../views/layouts/");
const assetsPath = path.join(__dirname, "./../views/assets/");
const viewsPath = path.join(__dirname, './../views/');
const load = (basePath, filename, data, cb = null) => {
let route ;
switch (basePath) {
case 'layout': {
route = layoutsPath;
break;
}
case 'asset': {
route = assetsPath;
break;
}
case 'view': {
route = viewsPath;
break;
}
default: {
route = basePath;
}
}
ejs.renderFile(path.join(route, filename), data, (err, str) => {
if (err) {
console.log(err);
return err;
}
if (cb === null) {
return str;
} else {
return cb(str);
}
});
}
module.exports = {
load
}
теперь в index.js
я хочу вывести мой home.ejs
внутри моего header.ejs
на клиент:
let allUsers = await usersModule.findAll();
let renderedHTML = '';
load('view', 'home.ejs', { allUsers }, (rendered) => {
load('layout', 'header.ejs', { mainView: rendered, cssLinks: ['/css/header.css'] }, (fullView) => {
renderedHTML = fullView;
});
});
res.status(200).send(renderedHTML);
поэтому здесь я получаю необходимые данные для моего тела из базы данных, передавая их в home.e js, там il oop и отображаю мое тело, например для home.e js:
<div>
<% for (let user of allUsers) { %>
<ul>
<li>email : <%= user.email %></li>
<li>name : <%= user.name %></li>
</ul>
<% } %>
</div>
Рендеринг тела передается нашему обратному вызову в качестве параметра, теперь мы можем передать его в наш заголовок с именем переменной * 103. 0 *, поэтому в верхнем колонтитуле все отображаемое тело будет вставлено в нужное место в нашем макете. Теперь наш макет и тело Dynami c объединены и готовы к отправке клиенту
.