NodeJS Express,添加事务ID

时间:2014-09-22 20:43:50

标签: javascript node.js express

民间,   尝试为每个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。

谢谢!

2 个答案:

答案 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();
            });

});
};

希望这会有所帮助