Привязать переменную к жизненному циклу запроса узла - PullRequest
0 голосов
/ 27 июня 2019

Для каждого запроса от клиента существует определенный набор констант, которые необходимо создать / запросить, а затем использовать несколько раз, пока ответ не будет отправлен.

Однако, поскольку они используются повсеместно и кодовая база уже достаточно велика, я заметил, что эти переменные просто запрашиваются / создаются несколько раз в течение запроса, а не передаются везде.

Чтобы быть справедливым, передача их в качестве аргументов повсюду сделает код довольно загроможденным.

Я не эксперт по жизненному циклу запросов Node, однако я знаю, что не могу просто установить эти переменные в глобальной области видимости, поскольку их значения различаются для каждого запроса (хотя они остаются постоянными на протяжении всего запроса), и, следовательно, будет применяться к каждому запросу сразу.

Таким образом, мой вопрос заключается в следующем: каким был бы самый разумный способ привязки группы переменных к конкретному контексту запроса, а это означает, что кодовая база может получить к ним доступ практически из любого места, аналогично глобальному, но пока только доступу? значение, специфичное для текущего запроса, для которого выполняется код?

Надеюсь, это имеет смысл.

Ответы [ 3 ]

1 голос
/ 27 июня 2019

Я думаю, что вы ищете что-то, что есть в контексте выполнения, и есть одна библиотека узлов, которая может сделать это для вас.Я использую там, где мне нужно использовать эти установленные объекты по линии в модулях или даже обновлять по линии.

Узел zone.js

Вы можете получить что-то вродеэто, Zone.current.get(MyName.MyRequestContext).userResourceData;

0 голосов
/ 27 июня 2019

Это именно то, для чего предназначены промежуточные программы.В Express промежуточное ПО использует тот факт, что в объектах javascript свойства не являются статичными и не должны подчиняться тому, что определено в его классе.

Например, ниже приводится промежуточное ПО, которое извлекает тело запроса и анализирует его какJSON:

function jsonBodyparser (req, res, next) {
    let rawData = '';

    req.on('data', bytes => {
        rawData += bytes.toString()
    });

    req.on('end', () => {
        req.body = JSON.parse(rawData);
        next(); // continue processing
    });
}

Аналогично, вы можете реализовать любую обычную логику в качестве промежуточного программного обеспечения:

function commonLogic (req, res, next) {
    // set common variables as properties of req or res:

    req.geoIP = getGeoIP(req);
    getUser().then(user => {
        req.language = user.preferences.language;

        // set variables you want to pass to templating engines
        // such as handlebars or ejs in res.locals:

        res.locals.username = user.name;
        res.locals.role = user.role;

        next(); // remember to call next() when you're done!
    });
}

Вы можете использовать ее как любое другое промежуточное программное обеспечение.У Express очень гибкая промежуточная архитектура:

// use it globally:
app.use(commonLogic);

// use it on some sub-path:
app.use('/some/path/*',commonLogic);

// use it on one end-point:
app.get('/some/path/to/endpoint', commonLogic, (req, res) => {
    // ...
    res.send('some response');
});

// use it with a router:
var router = express.Router();
router.use(commonLogic);
0 голосов
/ 27 июня 2019

Вы можете использовать личную переменную в файле и иметь функцию получения и установки для этой переменной. вы можете изменить или получить доступ к этому значению переменной в каждом запросе узла согласно вашему требованию.

Надеюсь, я правильно понял вопрос.

...