Как хранить переменные уровня запроса в node.js?

для данных, которые должны быть доступны только во время индивидуального запроса, где они должны храниться? Я создаю новые свойства для объектов req и res, поэтому мне не нужно передавать эти данные из функции в функцию.

req.myNewValue = 'just for this request'

является объектом процесса опцией? или он делится глобально по всем запросам?

Ответ 1

Если вы говорите о переменной, переданной как здесь:

http.createServer(function (req, res) {
    req.myNewValue = 'just for this request';
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(1337, '127.0.0.1');

тогда это прекрасно, что вы делаете. req хранит данные запроса, вы можете изменять их по req. Если вы используете какой-то фреймворк, такой как Express, то это тоже должно быть хорошо (имейте в виду, что вы можете перезаписать некоторые встроенные свойства объекта req).

Если под "объектом процесса" вы ссылаетесь на глобальную переменную process, то абсолютно нет. Данные здесь являются глобальными и не должны быть изменены вообще.

Ответ 2

В Express 4 наилучшей практикой является сохранение переменных уровня запросов на res.locals.

Объект, содержащий локальные переменные ответа, привязанные к запрос и, следовательно, доступный только для представлений, отображаемых во время этот цикл запроса/ответа (если таковой имеется). В противном случае это свойство идентично app.locals.

Это свойство полезно для отображения информации на уровне запроса, такой как имя пути запроса, аутентифицированный пользователь, пользовательские настройки и т.д.

app.use(function(req, res, next){
  res.locals.user = req.user;
  res.locals.authenticated = ! req.user.anonymous;
  next();
});

Объект process разделяется всеми запросами и не должен использоваться для каждого запроса.

Ответ 3

Если вы хотите сохранить данные в обратном вызове async, и могут быть сценарии, где объекты запроса и ответа недоступны. Таким образом, в этом случае continuation-local-storage пакет полезен.

Он используется для доступа к данным или текущему экспресс-запросу/ответу из точки, где это недоступно. Он использует концепцию пространства имен.

Вот как я настроил этот

Установите пакет continuation-local-storage

npm install continuation-local-storage --save

Создать пространство имен

let app = express();
let cls = require('continuation-local-storage');
let namespace = cls.createNamespace('com.domain');

затем промежуточное ПО

app.use((req, res, next) => {
   var namespace = cls.getNamespace('com.domain');
   // wrap the events from request and response
   namespace.bindEmitter(req);
   namespace.bindEmitter(res);

   // run following middleware in the scope of the namespace we created
   namespace.run(function () {
      // set data on the namespace, makes it available for all continuations
      namespace.set('data', "any_data");
      next();
   });
})

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

//logger.ts

var getNamespace = require("continuation-local-storage").getNamespace;
let namespace = getNamespace("com.domain");
let data = namespace.get("data");
console.log("data : ", data);