在NodeJS / KeystoneJS项目中设置/访问Nunjucks全局变量

时间:2018-05-17 10:09:00

标签: node.js keystonejs nunjucks

今天早上我花了很多时间来寻找如何做到这一点,并且感到难过。

我正在开发的项目是基于KeystoneJS / NodeJS构建的。它正在使用Nunjucks,我只有几天的基本经验。

我的问题是在加载配置服务的URI /端口的配置变量后,我想将它们设置为Nunjucks变量,因此在html视图中,我可以将它们用作src位置。

我不能在这里分享所有代码,因为我正在从事政府(英国)项目,但我希望这已经足够了。

Keystone.js

// Require keystone
var keystone = require('keystone');
var cons = require('consolidate');
var nunjucks = require('nunjucks');
var env = new nunjucks.Environment(null);

env.addGlobal('provision_uri', 3);

最初在路由后调用它:

Login.js

var keystone = require('keystone');
var nunjucks = require('nunjucks');

exports = module.exports = function (req, res) {

    var view = new keystone.View(req, res);
    var locals = res.locals;

    // locals.section is used to set the currently selected
    // item in the header navigation.
    locals.section = 'home';

    var env = new nunjucks.Environment(null);
    var provision_uri = env.getGlobal('provision_uri',3);

    console.log(`Uri ${provision_uri}`); **<-- ERRORS HERE**

    // Render the view
    view.render('login', {
        title: 'User Login',
        description: 'Login to your Account',
        provision_uri: provision_uri
    });
};

的login.html

<br>
<form action="{{provision_uri}}/session" method="post" name="user">
<div class="container">

当我启动项目时,加载着陆页,单击登录页面并在控制台中获取:

  

GET / provision / 304 74.147 ms

     

请求引发错误:/ login

     

错误:未找到全局:provision_uri

我已经检查了这个Question但它没有回答我的需要,但我查了环境。添加了全局作为答案。这似乎是我想要的,但它仍然无法奏效。我发现这个question提供了希望。

任何想法都会很棒,我确实有一个解决方法但想学习如何使用它们。

谢谢, 科林

1 个答案:

答案 0 :(得分:0)

您不需要在每次渲染调用中创建nunjucks环境的新实例。新范围(环境)具有空的全局空间。

var nunjucks = require('nunjucks');
var env = new nunjucks.Environment(null);
env.addGlobal('provision_uri', 3);
...
exports = module.exports = function (req, res) {
    ...
    var provision_uri = env.getGlobal('provision_uri',3);
    console.log(provision_uri);

    view.render('login', {
        title: 'User Login',
        description: 'Login to your Account',
        // provision_uri: provision_uri // it's not necessary
    });
}