首页 > 解决方案 > 为什么我的 nunjucks 页面没有被正确解释?

问题描述

在使用 express.js 的节点、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');

它工作正常。我已尝试将 sendfile 交换为重定向,但在页面上收到以下错误消息:
此页面无法正常工作
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;

获取应用程序引用 =

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');
    }
};

标签: node.jsexpressnunjucks

解决方案


首先,您在问题中显示的代码根本不包含 nunjucks 代码,因此很难看出您希望在哪里使用 nunjucks。您没有在代码中向我们展示太多细节,因此我们只能提供一般性建议。

如果你想让 nunjucks 呈现页面,你需要调用res.render("yourtemplate"),而不是res.sendFile(somefile)你需要正确注册 nunjucks 作为你的模板引擎。

如果您正在使用res.redirect('/decision/session-ended');,那么您需要一个适当的/decision/session-ended调用路由res.render()并且不会进行进一步的重定向,并且您需要确保该路由不会被您的中间件重定向(可能只是通过将该路由处理程序放在您的中间件之前)。

有关更多详细信息,请在此处显示从会话结束到涉及的所有请求的整个代码流。


推荐阅读