Как сохранить обработанные html файлы с ExpressJS маршрутов - PullRequest
0 голосов
/ 02 марта 2020

Я создал несколько страниц сайта c, используя ExpressJS и PUG, чтобы получить преимущество механизма шаблонов.

Но теперь мне нужно экспортировать все необработанные HTML это обрабатывается всеми ExpressJS Routes.

Есть ли какой-нибудь пакет, который может помочь мне сделать это? Или я должен написать пользовательскую команду и выполнить итерацию по всем Routes и сохранить обработанный вывод?

Если пользовательская команда является единственным способом, как мне выполнить итерацию по всем routes и получить отрендеренный вывод?

1 Ответ

0 голосов
/ 16 апреля 2020

Я не мог найти библиотеку или ресурс, чтобы достичь того, чего хотел. Но с некоторыми из моего грязного кода, хаков и пакетов я смог экспортировать все маршруты.

Примечание: Вместо написания команды узла для экспорта htmls, я добавил маршрут для запуска операций - это код для маршрута:

app.use('/export_templates', router.get('/', async function (req, res, next) {
  const endpoints = listEndpoints(app);
  const failedEndpoints = [];

  for (const i in endpoints) {
    const endpoint = endpoints[i];

    if (endpoint.path == '/export_templates') {
      continue;
    }

    try {
      const res = await axios.get('http://'+req.headers.host+''+endpoint.path+'?export=true');
    }
    catch(error) {
      failedEndpoints.push(endpoint.path);
    }
  }

  res.json({
    "status": "succes",
    "message": "Please check templates folder for the latest exported html templates",
    "failed": failedEndpoints
  })
}));

В основном этот маршрут повторяется и делает запрос на все доступные маршруты с параметром export=true.

Тогда внутри каждой функции просмотра маршрута условие проверяет, доступен ли параметр экспорта, затем вызывает функцию exportTemplateFile с расположением шаблона pug и новым именем файла в качестве параметра функции. Если запрос не содержит параметра export, то запрашиваемый маршрут просто выведет какой шаблон.

Пример маршрута:

router.get('/', function(req, res, next) {
  if (req.query.export) {
    exportTemplateFile('views/index.pug', 'index.html');
  }

  res.render('index.pug');
});

А вот код для завершения функции 2 util процесс экспорта

function createTemplateFile(filename) {
  fs.open(filename,'r',function(err, fd){
    if (err) {
      fs.writeFile(filename, '', function(err) {
          if(err) {
              console.log(err);
          }
      });
    }
  });
}

function exportTemplateFile(templateLocation, templateName) {
  const html = pretty(pug.renderFile(templateLocation));

  createTemplateFile('templates/'+templateName);

  var stream = fs.createWriteStream('templates/'+templateName);
  stream.once('open', function (fd) {
    stream.write(html);
    stream.end();
  });
}

Функция createTemplateFile просто создает новый файл, если он не существует.

Функция exportTemplateFile сохраняет HTML в html переменная отображается в pug и претифицирует ее с помощью пакета pretty, а затем перезаписывает новый файл шаблона.

Примечание: В моем случае все шаблоны pug были устаревшими c поэтому мне не пришлось передавать какой-либо контекст в функцию pug.renderFile. Но если вам нужен какой-либо контекст, который будет использоваться внутри шаблона pug, вы можете просто передать его вместе с расположением шаблона.

...