Я провел все утро в поисках того, как это сделать, и пришел в тупик.
Проект, над которым я работаю, построен на 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.info(`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
Error thrown for request: /login
Error: global not found: provision_uri
Я проверил этот Вопрос, но он не отвечает на то, что мне нужно, но я просмотрел файл environment.addGlobal, указанный в качестве ответа. Это действительно было то, что я хотел, но все равно это не сработало. Я нашел этот вопрос, который вселил надежду.
Любые идеи были бы замечательными, у меня есть обходной путь, но я хотел бы узнать, как их использовать.
Спасибо, Колин





Вам не нужно создавать новый экземпляр среды 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.info(provision_uri);
view.render('login', {
title: 'User Login',
description: 'Login to your Account',
// provision_uri: provision_uri // it's not necessary
});
}