2014-09-22 4 views
2

사람, 각 API 호출에 대한 트랜잭션 ID를 설정하려고합니다. 다음 작품 : 나는 (몽고에서 반환) 추가 정보를 추가하려고 할 때NodeJS Express, 트랜잭션 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(); 
     }); 

}; 

지금, 그것은 문맥 손실 :

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가 정의되지 않은, 아래로 더 사용할 수 없습니다 ... 어떻게 첫 번째 예제가 작동하고 두 번째 예제는 작동하지 않습니까?

내가 뭘 잘못하고 있니? 나는 문제가 다음() 컨텍스트에서 뭔가를해야한다고 생각한다. Express v4.

감사합니다.

+0

tid는 어디에 정의되어 있습니까? – DrakaSAN

+0

'result' 객체가 실제로'something' 속성을 가지고 있습니까? –

+0

여기에 언급 된 코드는 완전한 코드 예제를 게시해야한다고 제안합니다. 나는 최소한의 표현/몽고 설정을 의미합니다. – nha

답변

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

+1

나는 완전히 확신 할 수는 없지만 악명 높은 'this'와 관련이있다. mongo 함수 내에서는 명시 적 함수 내에서와 완전히 다른 의미를 갖는다. mongo 호출 중에 이것은 mongo db 객체가 될 것이므로 set()은 다른 함수이며 응답 객체는 호출 할 수 없습니다. 객체를 전달하면 프로토 타입 함수가 함께 전송되므로 호출 할 수있는 set() 함수가 유지됩니다. – beaglebets

+0

'mongoose'를 사용할 때 전혀이 문제가 보이지 않습니다. 귀하의 대답은 정확할 가능성이 큽니다. 확인하면 받아 들일 것입니다. 고맙습니다! – Cmag

-1

약속에서 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/ –

+0

참조이 코드는 어디에서 약속을 사용합니까? – Bergi

+0

나는 당신이 약속을 사용할 수 있다고 말했습니다. –