Почему моя страница nunjucks не интерпретируется должным образом?

#node.js #express #nunjucks

#node.js #экспресс #nunjucks

Вопрос:

В узле приложение js использует express.js , У меня есть часть промежуточного программного обеспечения, которое перенаправляет на страницу, завершенную сеансом, написанную в nunjucks, где это необходимо.

Перенаправление работает, если страница выводится как записанная, а не как html. По какой-то причине она не распознается как nunjucks.

 nunjucks.configure(['views',
    path.join(__dirname, 'node_modules/govuk-frontend/'),
    path.join(__dirname, 'node_modules/govuk-frontend/govuk/components/'),
    path.join(__dirname, 'app/views/')
], {
    autoescape: true,
    express: app
});

const endSession = (req, res, next) => {
  if (config.switchPage) {
   res.render(__dirname   '/app/views/pages/session-ended.html');
   return;
  } else {
    next();
  } 
};

app.use(endSession);
 

В другом месте я вызываю страницу с:

 res.redirect('/decision/session-ended');
 

и это работает нормально.
Я попытался заменить отправленный файл на перенаправление, но на странице появилось следующее сообщение об ошибке:
Эта страница не работает
localhost перенаправлял вас слишком много раз.
Попробуйте очистить файлы cookie.
ERR_TOO_MANY_REDIRECTS

==== ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ ====

Это промежуточное программное обеспечение запускается здесь:

 const getApplicationRef = (req, res) => {
    req.session.accessPage = '/decision/application-reference';
    res.render('pages/application-reference', { appRef: req.session.appRef });
};
 

который вызывает:

 const express = require('express');

const router = express.Router();

const { getApplicationRef, submitApplicationRef } = require('../../services/handler/application/application-ref-handler');

router.get('/', getApplicationRef);
router.post('/', submitApplicationRef);

module.exports = router;
 

getApplicationRef =

 const getApplicationRef = (req, res) => {
    req.session.accessPage = '/decision/application-reference';
    res.render('pages/application-reference', { appRef: req.session.appRef });
};
 

И вот некоторый код, который правильно отображает страницу:

 const getSecurityCode = (req, res) => {
    if (req.session.appRef) {
        req.session.accessPage = '/decision/security-code';
        res.render('pages/security-code', { secCode: req.session.secCode });
    } else {
        res.redirect('/decision/session-ended');
    }
};
 

Ответ №1:

Во-первых, код, который вы показали в своем вопросе, вообще не содержит кода nunjucks, поэтому трудно понять, где вы ожидаете, что что-то будет использовать nunjucks. Вы не показываете нам много деталей в своем коде, поэтому мы можем просто дать общий совет.

Если вы хотите, чтобы nunjucks отображал страницу, вам нужно вызвать res.render("yourtemplate") , а не res.sendFile(somefile) , и вам нужно правильно зарегистрировать nunjucks в качестве вашего движка шаблонов.

Если вы используете res.redirect('/decision/session-ended'); , то вам нужен маршрут /decision/session-ended , который вызывает res.render() соответствующие вызовы и НЕ выполняет дальнейшее перенаправление, и вам нужно убедиться, что маршрут не перенаправляется вашим промежуточным программным обеспечением (возможно, просто поместив этот обработчик маршрута перед вашим промежуточным программным обеспечением).

Для более подробной информации, пожалуйста, покажите весь поток кода, который имеет отношение к этому, начиная с момента окончания сеанса и заканчивая всеми задействованными в этом запросами.

Комментарии:

1. Теперь я использую render.res, как было предложено, и переместил код сразу после того, где инициализируется nunjucks. Я обновил свою публикацию, чтобы показать это. Теперь я получаю «Ошибку рендеринга шаблона» на странице. Как я уже сказал, страница отображается просто отлично, когда я вызываю ‘res.redirect (‘ / decision / session-ended’) из другого места, поэтому я знаю, что nunjucks в порядке, и я неохотно показываю nunjucks по соображениям конфиденциальности клиента (что заставляет меня казаться задницей, которую я знаю).

2. @jenkinz — Пожалуйста, покажите код, который вы используете, когда '/app/views/pages/session-ended.html' он отображается правильно. Ожидает ли этот файл шаблона отправки на него каких-либо данных? Мы мало что можем здесь сделать, если вы не показываете нам весь поток кода, или шаблон, или код, который, по вашим словам, работает.

3. Добавлена дополнительная информация. Здесь 1 час ночи, поэтому я отправляюсь спать. Вернется утром,