【问题标题】:Why is my nunjucks page not being interpreted properly?为什么我的 nunjucks 页面没有被正确解释?
【发布时间】:2021-03-17 00:01:06
【问题描述】:

在一个使用 express.js 的 node,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;

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

【问题讨论】:

    标签: node.js express nunjucks


    【解决方案1】:

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

    如果您希望 nunjucks 呈现页面,您需要调用 res.render("yourtemplate"),而不是 res.sendFile(somefile),并且您需要将 nunjucks 正确注册为您的模板引擎。

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

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

    【讨论】:

    • 我现在按照建议使用 render.res 并将代码移动到初始化 nunjucks 的位置之后。我已经更新了我的帖子以显示这一点。现在我在页面上收到“模板渲染错误”。正如我所说,当我从其他地方调用 'res.redirect('/decision/session-ended') 时,页面呈现得很好,所以我知道 nunjucks 很好,我不愿意出于客户保密的原因展示 nunjucks (这让我听起来像个混蛋)。
    • @jenkinz - 请在'/app/views/pages/session-ended.html' 正确渲染时显示您正在使用的代码。该模板文件是否需要向其发送一些数据?如果您不向我们展示整个代码流或模板或您所说的有效代码,我们在这里无能为力。
    • 已添加更多信息。这里是凌晨 1 点,所以我要去睡觉了。早上回来,
    猜你喜欢
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    相关资源
    最近更新 更多