Установка / доступ к глобальным переменным Nunjucks в проекте NodeJS / KeystoneJS

Я провел все утро в поисках того, как это сделать, и пришел в тупик.

Проект, над которым я работаю, построен на 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, указанный в качестве ответа. Это действительно было то, что я хотел, но все равно это не сработало. Я нашел этот вопрос, который вселил надежду.

Любые идеи были бы замечательными, у меня есть обходной путь, но я хотел бы узнать, как их использовать.

Спасибо, Колин

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
784
1

Ответы 1

Вам не нужно создавать новый экземпляр среды 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
    });
} 

Другие вопросы по теме