民间, 尝试为每个api调用设置事务ID。以下作品:
var cls = require('continuation-local-storage');
var uuid = require('node-uuid');
var namespace = cls.createNamespace('foo');
var tokenMiddleware = function tokenMiddleware(req, res, next){
namespace.bindEmitter(req);
namespace.bindEmitter(res);
namespace.run(function() {
namespace.set('tid', tid);
next();
});
};
现在,当我尝试添加其他信息(从mongo返回)时,它会丢失上下文:
var cls = require('continuation-local-storage');
var uuid = require('node-uuid');
var namespace = cls.createNamespace('foo');
var tokenMiddleware = function tokenMiddleware(req, res, next){
mongo.fetchId(authId, function (result) {
namespace.bindEmitter(req);
namespace.bindEmitter(res);
namespace.run(function() {
namespace.set('tid', tid);
namespace.set('somethingfromDB',result.something);
next();
});
});
};
事务ID无法进一步向下,未定义...第一个示例如何工作,第二个示例不工作?
我做错了什么?我怀疑问题必须与next()上下文有关。快递v4。
谢谢!
答案 0 :(得分:1)
我使用快递遇到了类似的问题。据我所知,mongo模块会覆盖请求和响应函数。进入数据库调用后,您会发现这些对象不再是您期望的对象。我的解决方案是将其拆分为2个独立的函数,允许您将它们显式传递给db函数。
var tokenMiddleware = function tokenMiddleware(req, res, next){
var callDB = function (req, res, namespace) {
mongo.fetchId(authId, function (result) {
namespace.bindEmitter(req);
namespace.bindEmitter(res);
namespace.run(function() {
namespace.set('tid', tid);
namespace.set('somethingfromDB',result.something);
next();
});
});
});
callDB(req, res, namespace)
};
答案 1 :(得分:-1)
尝试在承诺中设置SomethingfromDB。 参考 https://www.promisejs.org/ 或尝试在设置了fromfromdb之后分配tid
var cls = require('continuation-local-storage');
var uuid = require('node-uuid');
var namespace = cls.createNamespace('foo');
var tokenMiddleware = function tokenMiddleware(req, res, next){
mongo.fetchId(authId, function (result) {
namespace.bindEmitter(req);
namespace.bindEmitter(res);
namespace.run(function() {
namespace.set('somethingfromDB',result.something);
namespace.set('tid', tid);
next();
});
});
};
希望这会有所帮助