2016-09-28 2 views
0

모델 논리에서 루프백 컨텍스트 (또는 간단한 Express req 개체)에 어떻게 액세스 할 수 있습니까?모델 덮어 쓰기에서 액세스 루프백 컨텍스트/요청

모델 논리 내에서 요청 자체 (현재 사용자 신원이 무엇보다 중요)에 대해 더 많이 알 수 있어야합니다. 내장 된 메서드를 (사용자 지정 스크립트를 통해 또는 model.js 파일을 통해) 재정의하거나 사용자 지정 원격 메서드를 개발할 때 Express req 개체에 액세스하려고합니다.

loopback.getCurrentContext()가 버그로 선언되었으므로 사용할 수 없습니다.

아이디어가 있으십니까?

PS :이 LoopBackContext.getCurrentContext()를 사용하지 않는 것이 좋습니다 http://loopback.io/doc/en/lb2/Using-current-context.html

먼저이 (중요 빨간색 및 표시!) 말했다있어 다음 각 예에서 그것을 사용되는 : 나는 혼란이 페이지를 찾을 수 있습니다! ?

작동하지 않는 예제를 제공 할 때 요점은 무엇입니까? 우리는 단순히 전체 페이지를 무시해야합니까? 그렇다면 컨텍스트는 어떻습니까? :)

이 주제에 대한 설명이 있으면 감사하겠습니다.

답변

0

당신은 원격 후크

var loopback = require('loopback'); 
module.exports = function (MyModel) { 

MyModel.beforeRemote('findOne', function (ctx, model, next) { 
    //access to ctx.req 
    console.log(ctx.req.headers) 
    next()   
}) 

MyModel.beforeRemote('my-custom-remote-method', function (ctx, model, next) { 
    console.log(ctx.req.headers) 
    next() 
}) 

} 
+0

제가 알기로, 모델의 빌트인 CRUD 메소드 (정확하게는 무시 된 버전)에서 액세스하고 싶습니다. 나는 원격 훅 (remote hooks), 심지어는 원격 메소드 (remote methods)에서 문맥에 접근하는 데 문제가 없다. – Aleks

0

물론을 사용하여 REQ 객체를 표현하기 위해 액세스 할 수 있습니다, 당신은 ctx.args 속성을 수정하는 beforeRemote 후크를 사용할 수 있습니다. 이 속성은 원격 메서드 (즉, 사용자 지정 또는 기본 제공)의 입력입니다. 이렇게하면이 속성 내에 요청의 일부를 복사 할 수 있으며 내장 메서드 findOne을 사용하여

예제 1의 예제 1을 복사 할 수 있습니다.

MyModel.beforeRemote('findOne', function (ctx, model, next) { 
    ctx.args.filter.extrafield = ctx.req.headers['some-header']; 
    next();   
}); 

다음 override 당신이

MyModel.on('dataSourceAttached', function(obj){ 
    var findOne = MyModel.findOne; 
    MyModel.findOne = function(filter, cb) { 
     console.log(filter.extrafield); // Print what was in the header 
     return findOne.apply(this, arguments); 
    }; 
    }); 

을 그리고 마지막으로 원격 사용자 정의 printToken

curl -H "some-header: 'hello, world!'" localhost:3000/api/MyModel/findOne 

예 2와 메소드를 호출 할 무엇 때문에 findOne 방법, 추가 이해를 돕기 위해

MyModel.beforeRemote('printToken', function (ctx, model, next) { 
    ctx.args.token = ctx.req.headers['some-header']; 
    next();   
}); 

MyModel.printToken = function(token, cb) { 
    console.log(token); 
    cb(); 
} 

MyModel.remoteMethod(
    'printToken', 
    { 
    accepts: {arg: 'token', type: 'string', optional: true} 
    } 
); 

그리고 곱슬 원격 호출하고, 예상되는 헤더를 통과

curl -H "some-header: 'hello, world!'" localhost:3000/api/MyModel/printToken 

편집 :는 사용자 정의 작동 간단한 해결책이 원격

원격 방법을 정의 , 루프백에게 입력 요청으로 직접 리모콘에 http 요청 요소를 전달할 수 있습니다.

MyModel.remoteMethod(
    'printToken', 
    { 
    accepts: [ 
    {arg: 'req', type: 'object', 'http': {source: 'req'}}, 
    {arg: 'res', type: 'object', 'http': {source: 'res'}} 
    ] 
    } 
); 

이렇게하면 리모컨이 req 및 res 객체에 액세스 할 수 있습니다. 이것은 문서화되어 있습니다. here

+0

ctx가 내장 CRUD 메서드에 전달되지 않는다고 생각합니다. 이것이 전체적인 문제입니다. 그 예를 보여줄 수 있습니까? – Aleks

+0

'ctx' 자체는 전달되지 않지만'ctx.args'가 전달됩니다. 'ctx.args'는 CRUD 메소드에 전달되는 데이터입니다. – Overdrivr

+0

리모컨에서'object' 매개 변수의'filter' 매개 변수를 받아 들인다면'ctx.args'는'filter' 속성을 포함하게됩니다. – Overdrivr