NodeJS Express,添加交易标识

问题描述:

民间, 尝试为每个API调用设置交易ID。以下作品:NodeJS Express,添加交易标识

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

}; 

现在,当我尝试添加的附加信息(从蒙戈返回),它失去了语境:

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。

谢谢!

+0

tid在哪里定义? – DrakaSAN 2014-09-25 08:10:27

+0

'result'对象确实拥有'something'属性吗? – 2014-09-25 12:37:07

+0

这里的评论建议你也许应该发布一个完整的代码示例。我的意思是一个最小的快速/ mongo设置。 – nha 2014-09-25 19:03:38

我一直在使用快递有类似的问题。据我所知,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) 
}; 
+1

mongo如何覆盖该函数的局部变量? – Bergi 2014-09-29 00:46:29

+1

我不完全确定,但我相信它与臭名昭着的'这个'以及它所引用的有关。在mongo函数集中,与express函数中的含义完全不同。在mongo调用中,这将是mongo db对象,因此set()是一个不同的函数,并且响应对象不能调用它。通过传入对象,您可以将原型函数一起发送,从而维护一个可以在其上调用的set()函数。 – beaglebets 2014-09-29 01:34:00

+0

当使用'mongoose'我根本没有看到这个问题。你的回答很可能是正确的。当我验证时,会接受。谢谢! – Cmag 2014-09-29 04:27:51

尝试在promise中设置SomethingfromDB。 参考 https://www.promisejs.org/ 或尝试somethingfromdb设置

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

}); 
}; 

希望以后分配TID这有助于

+0

请参阅https://www.promisejs.org/ – 2014-09-25 12:50:00

+0

此代码使用承诺在哪里? – Bergi 2014-09-29 00:44:36

+0

我说你可以用promises – 2014-09-29 12:30:15