2012-07-05 4 views
11

다음은 기본 설정입니다. 나는 내 경로에서 클라이언트 측의 자바 스크립트로 데이터를 직접 쉽게 전달할 수있는 간단한 미들웨어 컴포넌트를 작성하려고한다. (루비에있는 Gon 보석과 매우 비슷합니다.) 내가하고 있어요 방법은 다음과 같습니다 모듈함으로써입니다 :Express.js의 미들웨어 모듈에서 응답 객체에 데이터를 추가해도됩니까?

module.exports = function(){ 
    return function(req,res,next){ 
     var app = req.app; 
     if(typeof(app) == 'undefined'){ 
      var err = new Error("The JShare module requires express"); 
      next(err); 
      return; 
     } 
     res.jshare = {}; 
     app.dynamicHelpers({ 
      includeJShare: function(req,res){ 
       if(typeof(res.jshare) === 'undefined'){ 
        return ""; 
       } 
       return function(){ 
        return '<script type="text/javascript">window.jshare=' + JSON.stringify(res.jshare) + '</script>'; 
       } 
      } 
     }); 
     next(); 
    }; 
} 

다음을, 내 길에 나는이 작업을 수행 할 수 있습니다

exports.index = function(req, res){ 
    res.jshare.person = {firstName : "Alex"}; 
    res.render('index', { title: 'Express' }) 
}; 

을 마지막으로 layout.jade에 :

!{includeJShare()} 

서버 쪽에서 생성 된 정확한 JSON 객체를 생성하는 클라이언트의 자바 스크립트 행을 출력합니다.

여기에 질문이 있습니다. 그것은 모두 예상대로 작동하지만 Express와 Node.js에 일반적으로 익숙하지 않은 경우, 응답 객체에 속성을 연결하는 것이 좋습니다. 아니면 간단히 간과 할 수있는 문제가 있습니까? 어떤 이유로 나는 "냄새 검사"를 통과하지 못하지만 왜 확실하지는 않습니다 .....

답변

10

그것은 완벽합니다. 자바 스크립트가 어떻게 설계되었나. 주의해야 할 것은 기존 속성을 우연히 덮어 쓰거나 다른 속성에 의해 무시되지 않는 것입니다. 대신 REQ의/입술 객체에 직접 모든 것을 추가하는, 더 안전 할, 당신은 더 깊은 수준을가는 고려해 볼 수 있습니다 : 그런

res.mydata={} 
res.mydata.person= ... 

합니다.

+0

답장을 보내 주셔서 감사합니다. 내 코드 샘플을 보면, 내가 한 단계 더 깊숙이 간다고 믿는다. 나는 "res.jshare.person"을 가지고있다. 그게 당신이 의미 한 것입니까? – BFree

+0

네, 그것이 바로 제가 의미했던 것입니다. 나는 당신의 코드를 비판하는 것을 의미하지 않았다, 나는 단지 그것을 강조하고 싶었다. 그래서 당신은 이미 올바른 일을했고 jshare는 다른 라이브러리에서 사용하게 될 일반적인 단어처럼 보이지 않습니다. 좋습니다. :) – hasanyasin

+0

나는 이유도 생각할 수 없다. 그러나 나는 요청에 더 많이 보인 것들을 보았다. 노드와 Connect/Express의 힘은이 오브젝트를 지나칠 때 발생하며, 각 레이어는 자신의 방식대로 확장합니다. Express는 응답 객체에 send()를 추가합니다. –

35

나는 이것이 오래된 스레드라는 것을 알고 있지만,이 주제에 추가 할 것이있다.

Express에는이 목적을위한 response.locals 오브젝트가 있습니다. 미들웨어의 응답을 확장하여보기에 사용할 수 있도록합니다.

응답 개체에 직접 속성을 추가 할 수 있으며 표시된대로 @hasanyas는 JavaScript가 디자인 된 방식입니다. 그러나 Express는보다 구체적으로 우리가 선호하는 특정한 방법을 가지고 있습니다.

이것은 Express 3.x의 새로운 기능 일 수 있습니다. 확실하지 않습니다. 이 질문이 제기되었을 때 아마도 존재하지 않았을 것입니다. 자세한 내용은

http://expressjs.com/en/api.html#res.locals

도 요청 요청에서 변화하지 않는 객체 (또는 응답에 따라 내 생각)에 대한 app.locals 있습니다 참조하십시오.

http://expressjs.com/en/api.html#app.locals

+0

젠체하는, 링크가 끊어졌으며 이것에 대한 참조를 찾을 수 없습니까? – Himmators

+1

Express 팀은 웹 사이트 URL 패턴을 로켈 코드를 포함하도록 변경했습니다. 이 대답에서 "en"을 올바르게 사용하려면 링크를 업데이트했습니다. – Brandon

+0

이것은 더 나은 대답입니다. @Bree, 당신은 그것을 바꿔야합니다! – Himmators

관련 문제