Как хранить переменные уровня запроса в 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);