2012-12-04 9 views
3

NodeJS에서 Javascript와 관련된 정말 이상한 버그가 있습니다."정의되지 않은"<propName> '의 속성을 읽을 수 없습니다.

거대한 data.json 파일 (24MB)이 있습니다.

TypeError: Cannot read property 'prop1' of undefined

: 나는 스크립트 실행 중에 어떤 시점에서, 나는

data['someProp']['prop1'] 

, 예를 들어, 액세스 시도하고 그것이 유형의 오류가 발생,

var data = JSON.parse(fs.readFileSync("./data.json", 'utf8')); 

그러나

를 통해 읽어 data, data['someProp'], data['someProp']['prop1']이 모두 정의되어 있기 때문에 실제로 이상합니다. 내가

console.log(data['someProp']['prop1']); 

을 할 경우

는 화면 제대로data['someProp']['prop1']의 값을 표시하고 즉시 유형의 오류가 발생합니다.

이 이상한 동작은 어떻게됩니까? 이러한 문제를 해결하기위한 추측이나 팁이 있습니까?


업데이트 :

나를 조금 더 명확하자. 나는 이상한 난 그냥 오류를 제기 어디 위의 라인에

console.log(data['someProp']['prop1']); 

를 넣어 경우, 올바르게 값 밖으로 인쇄 즉시 오류를 발생시킵니다 때문에 찾을 수 있습니다.

data['someProp']['prop1'] = "someProp value"을 예로 들어 보겠습니다.

그러면 오류 로그입니다.

{ 
    ... 
    "someProp": { 
    "prop1": "someProp value" 
    }, 
    ... 
} 
undefined 

이 내가 혼란 스러워요 부분이다 :

someProp value 

console.log(data['someProp']['prop1']); 
         ^

TypeError: Cannot read property 'prop1' of undefined 

그래서

console.log(data['someProp']) 

할 경우,이 내가 얻을 로그입니다. 내가 console.log 할 때 data['someProp']의 내용을 출력하고 바로 뒤에 undefined을 출력합니다. 무엇이 이것을 일으킬 수 있습니까?

또 다른 이상한 점은

console.log(typeof data['someProp']); 

결과는이다 :

object 
undefined 

어떻게 data['someProp']undefined뿐만 아니라 객체가 될 수 있습니까?

+2

* "... 스크립트 실행 중 어느 시점에서 ..."글쎄, 열쇠 인 것처럼 보입니다. 그것이'undefined '라고 말하면'undefined'라는 뜻입니다. 정의되기 전에 코드를 실행하거나 속성을 잘못 액세스하고 있습니다. 어느 쪽이든, 귀하가 제공 한 것으로부터 문제를 알 수 없습니다. –

+0

이 질문을 살펴보면 n 레벨의 속성을 호출하는 함수가 있으며 null이면 빈 문자열을 반환합니다. http://stackoverflow.com/questions/13345449/calling-object-properties-in-n-levels-javascript –

+0

@ user1689607 업데이트 된 질문을 볼 수 있습니까? 나는 console.log가 값을 올바르게 표시하고 그것이 정의되지 않았다고 즉시 불평하기 때문에 혼란 스럽다. 이 오류가 data.json 파일의 일부 텍스트 인코딩으로 인해 발생하는지 궁금합니다. 하지만 그건 내 추측입니다. –

답변

1

좋아, 내 자신의 질문에 대답하고이 질문을 닫습니다.

user1689607이 짐작하면 내 비동기 코드에 버그가 있습니다. 예를 들어, 내 코드 보였다 같은 : 이후

function test(done) { 
    ... 
    if (err) { 
    done(); 
    } 
    ... 
    if (data['someProp']['prop1']) { 
    ... 
    done(); 
    } 
} 

첫 번째() 반환하지 않고 불렀다, 나는 그것이 콜백 실행의 끝에서 다시 와서 코드의 나머지는 shouldn 통과 생각 완료 '티. 그 시간 동안 데이터에 약간의 변화가 있었고 이것이 오류의 원인이었습니다.

그래서 return done();이 문제를 해결했습니다.

감사합니다. @ user1689607.

관련 문제