Если у вас есть куча страниц, которые должны вызывать res.render()
, но вы не передаете пользовательские параметры для каждого рендера, вы можете изолировать все эти шаблоны в их собственном каталоге, а затем использовать некоторое промежуточное программное обеспечение, например:
const path = require('path');
const fs = require('fs');
function renderStatic(dir, options) {
const regex = /^\.|\.\.|\/\.|\\\./;
options = options || {};
return function(req, res, next) {
let target = path.join(dir, req.path);
if (options.ext && !path.extname(target)) {
target = target + options.ext;
}
// don't allow leading dot or double dot anywhere in the path
if (regex.test(target)) {
next();
return;
}
fs.access(target, fs.constants.R_OK, function(err) {
if (err) {
// file not found, just move on
next();
} else {
res.render(target);
}
});
}
}
app.use(renderStatic(path.join(__dirname, "renderPublic"), {ext: ".ejs"}));
Обратите внимание, что вы должны изолировать эти файлы шаблонов в их собственном каталоге, чтобы другие файлы там не находились.
Для полноты безопасности этот код также должен отфильтровывать элементы .
и ..
в пути, как express.static()
, чтобы не дать злоумышленнику подняться по иерархии каталогов, чтобы получить доступ к другим файлам, чем те, которые находятся в визуализировать статический каталог.
Затем для маршрутов, которые вы используете res.sendFile()
и никакой другой логики, просто изолируйте эти HTML-файлы в их собственном каталоге и укажите express.static()
в этом каталоге. Затем промежуточное ПО express.static()
найдет соответствующий HTML-файл в этом каталоге и автоматически сделает для вас res.sendFile()
, точно так же, как это делается для ваших CSS-файлов.