2014-09-22 34 views
2

民間, 嘗試爲每個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

回答

1

我一直在使用快遞有類似的問題。據我所知,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

-1

嘗試在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