NodeJS Express,添加事务ID

NodeJS Express, adding transaction ids

本文关键字:事务 ID 添加 Express NodeJS      更新时间:2023-09-26

各位,尝试为每个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()上下文有关。Express v4。

谢谢!

我在使用express时也遇到过类似的问题。据我所知,mongo模块覆盖了请求和响应函数。一旦你进入数据库调用,你会发现这些对象不再是你期望的样子。我的解决方案是将其拆分为两个单独的函数,这样你就可以显式地将它们传递给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)
};

尝试在promise中设置SomethingfromDB。参考https://www.promisejs.org/或者在设置后尝试分配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();
            });
});
};

希望这对有帮助