2011-03-21 10 views
75

EJS github 페이지에는 간단한 예제가 하나뿐입니다. https://github.com/visionmedia/ejsExpressJS를 사용하여 EJS 템플릿에 변수가 있는지 확인하는 적절한 방법은 무엇입니까?

예제

<% if (user) { %> 
    <h2><%= user.name %></h2> 
<% } %> 

이것은 user라는 변수의 존재 여부를 확인하는 것입니다. 몇 가지 일을하십시오. 그쵸?

내 질문은, 왜 세계에서 사용자 변수가 존재하지 않는 경우 Node가 ReferenceError를 던지겠습니까? 위의 예는 쓸모가 없습니다. 변수의 존재를 확인하는 적절한 방법은 무엇입니까? try/catch 메커니즘을 사용하여 ReferenceError를 가져올 것으로 예상됩니까?

ReferenceError: user is not defined 
    at IncomingMessage.anonymous (eval at <anonymous> (/usr/local/lib/node/.npm/ejs/0.3.1/package/lib/ejs.js:140:12)) 
    at IncomingMessage.<anonymous> (/usr/local/lib/node/.npm/ejs/0.3.1/package/lib/ejs.js:142:15) 
    at Object.render (/usr/local/lib/node/.npm/ejs/0.3.1/package/lib/ejs.js:177:13) 
    at ServerResponse.render (/usr/local/lib/node/.npm/express/1.0.7/package/lib/express/view.js:334:22) 
    at Object.<anonymous> (/Users/me/Dropbox/Projects/myproject/server.js:188:9) 
    at param (/usr/local/lib/node/.npm/connect/0.5.10/package/lib/connect/middleware/router.js:146:21) 
    at pass (/usr/local/lib/node/.npm/connect/0.5.10/package/lib/connect/middleware/router.js:162:10) 
    at /usr/local/lib/node/.npm/connect/0.5.10/package/lib/connect/middleware/router.js:152:27 
    at Object.restrict (/Users/me/Dropbox/Projects/myproject/server.js:94:5) 
    at param (/usr/local/lib/node/.npm/connect/0.5.10/package/lib/connect/middleware/router.js:146:21) 

서버 코드에 "user"로컬 변수를 추가하는 것만으로이 오류를 해결할 수 있다는 것을 이해합니다.하지만 여기서는 런타임에서 이러한 변수의 존재를 확인하고 싶습니다. 당신의 매일을 사용한다면/다른 경우에는 널 검사 패턴을 사용하십시오. 존재하지 않는 변수에 대한 예외는 나에게 어리 석다.

답변

91

js, typeof foo == 'undefined'에있는 것과 같은 방식으로 또는 "locals"가 포함 된 개체의 이름이므로 if (locals.foo)을 사용할 수 있습니다. 그것은 단지 원시 js입니다 : p

+3

내 손에 큰 문제가 있는지 궁금해지기 시작했습니다. 이것도 참조 오류를 throw합니다 : <% alert ('test'); %> –

+1

@Aashay'alert'는 브라우저의'window' 객체의 일부이며, node.js에서는 사용할 수 없습니다. 대안은'console.log'이지만,'locals'를 통해 전달하지 않으면 ejs 템플릿에서 사용할 수 있을지 모르겠습니다. – Zikes

+2

@Zikes이 경우 저는 EJS를 특별히 찾고 있습니다. 따라서 브라우저 페이지에 있습니다. 그러나 TJ가 말한 것처럼 typeof foo == 'undefined'가 작동합니다. 나는 foo가 정의되었지만 null이거나 비어있는 경우에도 간단한 !! foo를 추가 할 수 있다는 것을 배웠다. –

5

나는 몽구스의 populate()와 함께 2 개의 콜렉션 사이에 관계를 만들 때 동일한 문제를 mongoose/express/ejs와 함께 node.js를 사용하여 보았습니다.이 경우에는 admins.user_id가 있었지만 존재하지 않는 사용자와 관련이 있습니다 ._id.
그래서, 찾을 수없는 이유 :

if (typeof users.user_id.name == 'undefined') ... 

이 그럼 내가이 다음과 같이 점검 할 필요가 나타났습니다 "널 (null)의 특성 '이름'읽을 수 없습니다"로 실패했다 :

if (typeof users.user_id == 'undefined') ... 

'이름'의 '컨테이너'를 확인해야하므로 작동했습니다.
그 후,이 같은 일 :

if (!users.user_id) ... 

는 도움이되기를 바랍니다.

+0

나에게 마지막이 작동하지 않는 경우, 내가 사용해야' typeof'. – TheBronx

+0

어쨌든, EJS에 대한 공식 문서가 거의 없다는 것을 믿을 수 없습니다. 그들은 2010 년부터 [documentation] (http://www.embeddedjs.com/)을 업데이트하지 않습니다 !!! – aesede

10

당신은 "OBJ === 무효 0"으로 확인 뷰 헬퍼를 만들 수 있습니다,이 하나 express.js입니다 :

res.locals.get = function() { 
    var args = Array.prototype.slice.call(arguments, 0); 
    var path = args[0].split('.'); 
    var root = this; 
    for (var i = 0; i < path.length; i++) { 
     if(root[path[i]] === void 0) { 
      return args[1]?args[1]:null; 
     } else { 
      root = root[path[i]]; 
     } 
    }; 
    return root; 
} 

그런

<%- get('deep.nested.non.existent.value') %> //returns: null 
<%- get('deep.nested.non.existent.value', "default value") %> //returns: default value 
+2

왜 이것이 downvoted인지, 내 의견으로는 그 우아한. – joseym

10
처럼 뷰에서 사용

사용자가 정의되어있는 경우, 당신이해야하는지 확인하기 :

<% if (this.user) { %> 
    here, user is defined 
<% } %> 
+3

이것은 최신 EJS 라이브러리 (1.0.0)에서 작동하지 않습니다. 유효한 자바 스크립트이지만 EJS는 예상대로 작동하지 않습니다. – Axoren

+0

최신 EJS에서 작동하는 것으로 보인다 2.3.4 – Stepan

+4

나를 위해 작동하지 않습니다. 'foo'를 정의했지만, else 절도 여전히 평가됩니다. EJS 2.3.4로 테스트되었습니다. EDIT :'this' 대신'locals'를 사용하면 작동합니다. –

0

난 그냥 전화 기본 개체를 전달하면됩니다 무엇 '데이터'= ''와 그것을 모든 내 ejs 템플릿에 전달하십시오. ejs 템플릿에 실제 데이터를 전달해야하는 경우 'data'객체의 속성으로 추가하십시오.

이렇게 'data'객체는 항상 정의되며 ejs 템플릿에는 'data'속성이 있지만 노드 표현 경로에는 존재하지 않더라도 정의되지 않은 오류 메시지가 표시되지 않습니다.당신의 if 문에 대한

1

당신은 typeof를 사용해야합니다 :

<% if (typeof user == 'object' && user) { %> 

<% } %> 
7

locals

예와 변수를 앞에 추가하십시오 : 나는이 같은 문제가 있었다

5
<% if (locals.user) { %> 

// Your logic goes here 

<% } %> 
0

if(locals.user){}, 운 좋게 , 나는 또한 단락 회로가 있다는 것을 발견했다. JS에서 (나는 루비와 다른 언어들에 하나가 있다는 것을 알았다.) 내 서버/컨트롤러 측면에서

(이는 Node.js를/Express에서입니다) : 내가 거기에 무슨 짓을했는지

return res.render('result', {survey_result : req.session.survey_result&&req.session.survey_result.survey }); 

은 참조하십시오? 가능하지 않은 변수 (양식 데이터가 있거나 없을 수도있는 request.session.survey_result 개체) 다음에 오는 & &은 JS의 단락 표기법입니다. 이 기능은 & &의 왼쪽 부분이 정의되지 않은 경우에만 & & 부분을 평가합니다. 왼쪽 부분이 undefined 일 때도 오류가 발생하지 않습니다. 그냥 무시합니다.

난 그냥 들어,도 단락을 사용

<table> 
    <tr> 
     <td> Name:</td> 
     <td> <%=survey_result&&survey_result.name%></td> 
    </tr> 
    <tr> 
     <td> Dojo Location:</td> 
     <td> <%=survey_result&&survey_result.dojo_loc%></td> 
    </tr> 
    <tr> 
     <td> Favourite Language:</td> 
     <td> <%=survey_result&&survey_result.fave_lang%></td> 
    </tr> 
안전 - :

이제 내 템플릿에 다음 나는대로 필드를 렌더링 (나는 survey_result으로 내보기로 개체 req.session.survey_result_survey 객체를 전달 기억) 유지.

내가 이전에 제안 된 방법으로 그것을 시도, 단지 : 때때로

<% if (typeof survey_result !== undefined) { %> 
... <!-- some js and/or html code here --> 
<% } %> 

, 그것은 여전히 ​​IF 문 내의 특성을 평가하기 위해 노력할 것이다 ... 어쩌면 누군가가 이유에 대한 설명을 제공 할 수 있습니까?

또한 앞의 예제에서 보았 듯이 undefined은 작은 따옴표가 필요하지 않다는 점을 수정하고 싶습니다. 문자열 값 'undefined'과 데이터 유형 undefined을 비교할 때 조건은 true으로 계산되지 않으므로

관련 문제