2012-05-04 5 views
1

Express 프레임 워크를 사용하여 nodejs로, 데이터베이스에 couchdb를, 템플릿 용으로 EJS로 간단한 웹 사이트를 만들고 있습니다. 내 필드의 일부가 내 JSON 문서에서 null이거나 정의되지 않은 경우가 있으며이를 처리해야합니다.Express, EJS, 정의되지 않은 테스트에 대한 도전

<% if (typeof test !== 'undefined') { %> 
    <p><%= test %></p> 
<% } %> 

코드의 비트는 정의가 잘되는 '테스트'필드를 처리하는 것 같다,하지만 아래 코드는 자바 스크립트를하지 않는 이유는

<% if (test) { %> 
    <p><%= test %></p> 
<% } %> 

을 '테스트가 정의되어 있지 않습니다'라는 오류가 발생합니다 테스트가 정의되지 않았 음을 이해하고 if 절에 false를 넣으시겠습니까?

+0

을 ... 그 정의되지 않은 허위 때문이 아니라 : – Loktar

답변

10

때문입니다. 그 이유는 이해할 수 있지만 그 영향은 혼란 스러울 수 있습니다. 특히 변수 이름 대 객체 속성과 관련해서는 혼란 스러울 수 있습니다.

정의되지 않은 변수에 액세스하려고하면 예외가 throw되는 것을 보여 줬습니다. 은 "정의되지 않은"유형 (변수가 정의되지 않은)이 상태를 혼동하지 마십시오 :

if (bogusVariable) { // throws ReferenceError: bogusVariable is not defined. 
typeof(bogusVariable); // => undefined - wow, that's confusing. 

그러나, 정의되지 않은 객체의 속성 안전하게 테스트 할 수 있습니다 :

var x = {}; // an object 
x.foo; // => undefined - since "x" has no property "foo". 
typeof(x.foo); // => undefined 
if (!x.foo) { /* true */ } 

당신은 할 수 모든 변수가 실제로 "전역"객체 (웹 브라우저의 "전역"또는 "창")의 속성임을 지적하여이 속성을 활용하십시오.

bogus; // => ReferenceError: bogus is not defined. 
global.bogus; // => undefined (on node/rhino) 
window.bogus; // => undefined (on web browsers) 

그래서 당신은 같은 당신의 EJS 코드를 작성 할 수 있습니다 자바 스크립트 언어의 많은 부분과 마찬가지로

<% if (global.test) { %> 
    <p><%= test %></p> 
<% } %> 

네, 혼란입니다.

<% if (this.test) { %> 
    here, test is defined 
<% } %> 
+0

그런 자세한 답변을 주셔서 감사합니다, 내 문제는 실제로 JavaScript가 아니었다. js는 괜찮 았고, 오류가 급행 안에서 왔고 변수가 존재하지 않았다. 변수는 템플릿에서 정상적으로 처리되었으므로 express의 렌더링 함수가 해당 오류를 덤프했습니다. 감사! – Costa

+0

'if (global.test)'테스트로 답안의 코드가 나에게 적합하지 않은 경우 마지막 부분을 사용하십시오. 항상 예외를 throw합니다. 나는 그것을 if (typeof (global.text)! == 'undefined')'로 검사해야했다. – Patryk

4

대부분의 언어는 다음과 같습니다 : "정의되지 않은"의 개념은 자바 스크립트 언어로 정의 된 변수 존재의 상태와 다른

irb 
    >> foo 
    NameError: undefined local variable or method `foo' for main:Object 
     from (irb):1 
+0

고마워, 내 문제는 실제로 JavaScript가 아니었다. js는 괜찮 았고, 오류가 급행 안에서 왔고 변수가 존재하지 않았다. 변수는 템플릿에서 정상적으로 처리되었으므로 express의 렌더링 함수가 해당 오류를 덤프했습니다. 감사! – Costa

1

테스트가 정의되어있는 경우, 당신이 할 필요가 확인하려면? 나는 개인적으로 행복하지 않다. "아, 이봐 요, 당신은 틀림없이이 정의가 거짓임을 의미해야합니다."
관련 문제