Узел - продолжение-локальное хранилище
Я пытаюсь использовать пакет extension-local-storage для доступа к текущему экспресс-запросу / ответу из точки, где это не всегда доступно.
Я создал следующее промежуточное ПО:
var createNamespace = require('continuation-local-storage').createNamespace,
getNamespace = require('continuation-local-storage').getNamespace;
const domain = 'ns.cls';
exports.configure = function(app) {
createNamespace(domain);
app.use(function(req, res, next) {
exports.set(req, res, "callcontext", { req, res });
next();
});
};
exports.set = function(req, res, name, value) {
var namespace = getNamespace(domain);
namespace.bindEmitter(req);
namespace.bindEmitter(res);
namespace.run(() => namespace.set(name, value));
};
exports.get = function(name) {
var namespace = getNamespace(domain);
return namespace.get(name);
};
exports.getCallContext = function() {
return exports.get("callcontext");
};
Однако, когда я пытаюсь получить доступ к контексту, он не определен:
var localStorage = require('../middleware/local-storage');
module.exports = function(doc, ctx) {
var callContext = localStorage.getCallContext();
console.log("value: " + callContext);
};
У кого-нибудь есть какие-либо идеи?
Заранее спасибо,
отметка
1 ответ
createNameSpace следует вызывать один раз. Кроме того, у вас есть ошибка в сети
exports.set(req, res, "callcontext", { req, res });
должно быть что-то вроде
exports.set(req, res, "callcontext", { key: value });
Вот как я это использую:
установить
var session = require('continuation-local-storage').createNamespace('session')
app.use(function(req, res, next) {
session.bindEmitter(req);
session.bindEmitter(res);
session.run(function() {
session.set('req', req);
next();
});
});
получить
var session = require('continuation-local-storage').getNamespace('session')
session.get('req')