2011-01-28 3 views
5

nodejs에서 express를 사용하고 있으며 내 뷰 렌더링을 유지하려고 노력 중입니다. 내 레이아웃 내부, 나는 다음 (내가 사용 옥) 같은expressjs 렌더링에서 레이아웃 로컬을 DRY up

body 
    nav.login 
    -if(currentUser) 
     ="logged in information" 
    -else 
     ="logged out information" 
    !=body 

문제는 내가 렌더링 할 때마다이, 내가 지금 그것은 것 같다

res.render('anything.jade',{ 
    locals: { 
    currentUser: req.session.currentUser, 
    /*all of my other locals*/ 
    } 
}); 

이 필요 해요이다가 내 렌더링 호출을 모두 거쳐 추가해야하는 고통, 그리고 레이아웃에 다른 지역 주민을 추가해야하는 경우 동일한 작업을 수행해야합니다. 렌더링하는 모든 곳에서 'currentUser'를 지역 주민에게 다시 입력하지 않아도되는 몇 가지 방법이 있습니까?

답변

9

나는이 대답은 후반이지만, 후손 알 수 있습니다 경우 당신은 express를 사용하고 있는데, 당신은 인수로 req,res을 취하는 view-accessible 헬퍼 함수 인 제공된 동적 헬퍼를 사용해야한다. 귀하의 경우 :보기를 의미

app.dynamicHelpers({ 
    user: function(req, res){ 
    return req.session.currentUser; 
    } 
}); 

지금이 내 것보다 더 나은 해답처럼 보이는 #{user}

+0

를 호출 할 수 있습니다; 내가 처음 질문을했을 때 얼마나 잘 통합 헬퍼가 익스프레스에 있었는지 모르겠다. – Ryan

+0

이것은 좋은 팁이다. 각 render() 호출에 "site"객체를 전달했습니다. 감사! –

0

가장 쉬운 해결책은 지역 객체를 반환하는 함수를 사용하는 것입니다.

function(req) { 
    return { 
     currentUser: req.session.currentUser, 
     /*all of my other locals*/ 
    }; 
} 

res.render('anything.jade',{ 
    locals: defaultLocals(req) 
}); 
2

내가 다음 일을 결국 :

첫째, 내가

app.use(function(req,res,next){ 
    req.localvars = new Object; 
    next(); 
}); 

이후 일부 지역 변수를 설정, 나는 어떤 지역 변수

app.use(function(req,res,next){ 
    req.localvars.currentUser = req.session.currentUser; 
    next(); 
}); 

을 설정

내가 설정 렌더링 함수

function renderer(file){ 
    return function(req,res,next){ 
    res.render(file,{locals:req.localvars}); 
    } 
} 

다음 라우팅 기능

app.get('/',blah,blah,whatever,setSomeMoreLocalsHere,renderer(index.jade)); 

이 더 나은 뭔가,하지만 내가 알아 냈어요 최적의 솔루션입니다 지금까지