2016-09-04 2 views
1

url 경로 이름을 가져 오는 meta 태그 handlebars 도우미를 만들고이 값을 HTML의 메타 태그에 반환하는 switch 문에 해당 값을 사용하려고합니다. 머리,하지만 지금은 가장 좋은 방법은 현재 내 스위치 성명에 대한 URL 경로를 잡아 확실하지 않다. window.location.pathname을 시도했지만 window이 정의되지 않은 오류가 발생합니다. 경로 모듈이 파싱하기 위해 무언가를 전달해야한다는 것을 알고 있지만 최선의 가치가 무엇인지 확신 할 수 없습니다. 누구든지 나를 도울 수 있습니까? 템플릿 쿼리 할 window 객체가없는 서버에서 실행되기 때문에Nodejs + Handlebars - 현재 url 경로를 가져 와서 도우미로 전달

var path = require('path'); 

    var metaHelpers = function(hbs) { 

    hbs.registerHelper('metaTitle', function(){ 
     var urlPath = path.dirname(); 
     console.log(urlPath); 
     switch(urlPath) { 
      case "/": { 
       return 'Index Test' 
      } 
      break; 
      case "/login": { 
       return 'Login Test' 
      } 
      break; 
      default: { 
        return 'No Meta Tag' 
       } 
      } 
    }); 

    }; 

    module.exports = metaHelpers; 
+0

[Express] (http://expressjs.com/)을 웹 프레임 워크로 사용하고 있습니까? – 76484

+0

@ 76484예요 나는 – cphill

+0

입니다. 나는'req.originalUrl'을 시도했지만 '속성을 읽을 수 없습니다'undefined의 originalUrl '을 받았습니다. – cphill

답변

1

:

여기 내 핸들 도우미 파일입니다. 대신 현재 Request 객체에서 URL 경로를 가져와야합니다. 다행히도 Express에서 Request 객체는 path 속성을가집니다.

그러나 솔루션을 Handlebars 도우미로 구현하려면 요청 개체 (또는 적어도 .path 이상)를보기에서 도우미로 전달하는 방법을 찾아야합니다. 더 나은 해결책은 도우미 논리를 실행하고 응답이 렌더링되기 전에 이라는 제목을 구성하는 것입니다.

Express는 요청별로 요청 및 응답 오브젝트를 수정할 수있는 기능인 middleware의 개념을 가지고 있습니다. 각 요청에 대한 제목을 구성하기 위해 미들웨어 함수를 작성한 다음 Response 객체의 locals 속성에 추가 할 수 있습니다. res.locals 개체의 속성은 현재 응답으로 렌더링 된 뷰에서 사용할 수 있습니다.

app.use(function (req, res, next) { 
    switch (req.path) { 
     case '/': 
      res.locals.title = 'Index Test'; 
      break; 
     case '/login': 
      res.locals.title = 'Login Test'; 
      break; 
     default: 
      res.locals.title = 'No Meta Tag'; 
    } 
    next(); 
}); 

는 우리의 레이아웃에서, 우리는 title 속성에 액세스 할 수 있습니다와 같은 우리 우리의 견해 모델의 다른 재산 것. 참고로

<title>{{title}}</title> 

, this answer 그것이 res.localsreq 객체를 할당하는 것을 제외하고 유사한 솔루션을 제공한다.

+1

이것은 분명히이 문제에 접근하는 더 좋은 방법입니다. 나를 위해 일합니다. 고맙습니다! – cphill

관련 문제