2016-10-02 1 views
0

잘못 나타날 것 때문에 이상한 오류가에 '마크'의 PROPERT를 설정할 수 없습니다, 오류는 다음과 같습니다가 정의되지 않은

TypeError: Cannot set property 'mark' of undefined 
at /home/ubuntu/workspace/tests/app.js:194:36 
at Layer.handle [as handle_request](/home/ubuntu/workspace/tests/node_modules/express/lib/router/layer.js:95:5) 
at next (/home/ubuntu/workspace/tests/node_modules/express/lib/router/route.js:131:13) 
at Route.dispatch (/home/ubuntu/workspace/tests/node_modules/express/lib/router/route.js:112:3) 
at Layer.handle [as handle_request] (/home/ubuntu/workspace/tests/node_modules/express/lib/router/layer.js:95:5) 
at /home/ubuntu/workspace/tests/node_modules/express/lib/router/index.js:277:22 
at Function.process_params (/home/ubuntu/workspace/tests/node_modules/express/lib/router/index.js:330:12) 
at next (/home/ubuntu/workspace/tests/node_modules/express/lib/router/index.js:271:10) 
at SessionStrategy.module.exports.strategy.pass (/home/ubuntu/workspace/tests/node_modules/passport/lib/middleware/authenticate.js:325:9) 
at SessionStrategy.authenticate (/home/ubuntu/workspace/tests/node_modules/passport/lib/strategies/session.js:71:10) 
at attempt (/home/ubuntu/workspace/tests/node_modules/passport/lib/middleware/authenticate.js:348:16) 
at authenticate (/home/ubuntu/workspace/tests/node_modules/passport/lib/middleware/authenticate.js:349:7) 
at Layer.handle [as handle_request] (/home/ubuntu/workspace/tests/node_modules/express/lib/router/layer.js:95:5) 
at trim_prefix (/home/ubuntu/workspace/tests/node_modules/express/lib/router/index.js:312:13) 
at /home/ubuntu/workspace/tests/node_modules/express/lib/router/index.js:280:7 
at Function.process_params (/home/ubuntu/workspace/tests/node_modules/express/lib/router/index.js:330:12) 

이 오류를 생성하는 코드는 다음과 같습니다

for(var i = 0;i < req.body.numOfMethods;i++) 
{ 
    for(var x = 0;x< numOfParts[i];x++) 
    { 
     methodsArray[i][x].mark=parts[i][x].mark; 
     methodsArray[i][x].content=parts[i][x].content; 
    } 
} 
나는이 텍스트

console.log("numOfParts[i] = "+numOfParts[0]); 
console.log("numOfParts[i] = "+numOfParts[1]); 
console.log("numOfMethods = "+req.body.numOfMethods); 
for(var i = 0;i < req.body.numOfMethods;i++) 
{ 
    for(var x = 0;x< numOfParts[i];x++) 
    { 
     console.log("i = "+i); 
     console.log("x = "+x); 
     console.log("parts[i][x].mark = "+parts[i][x].mark); 
     console.log("parts[i][x].content = "+parts[i][x].content); 
    } 
} 

아래의 코드를 실행하면

는 그러나 그것은 출력합니다 :

numOfParts[i] = 3 
numOfParts[i] = 2 
numOfMethods = 2 
i = 0 
x = 0 
parts[i][x].mark = 2 
parts[i][x].content = test 
i = 0 
x = 1 
parts[i][x].mark = 2 
parts[i][x].content = test 
i = 0 
x = 2 
parts[i][x].mark = 2 
parts[i][x].content = test 
i = 1 
x = 0 
parts[i][x].mark = 3 
parts[i][x].content = test 
i = 1 
x = 1 
parts[i][x].mark = 3 
parts[i][x].content = test 

methodsArray[i][x].mark이 정의되지 않은 값으로 설정되어 있지 않음을 나타내는 매우 많은 정보. 그래서 궁극적으로 나는이 오류를 수정하기 위해 무엇을해야하는지에 관해서는 상당히 분실했다. 나는 문제의 배열을 정의 할 경우 다음

var methodsArray=[[{mark:Number,content:String}]]; 
    var numOfParts=[req.body.m1parts,req.body.m2parts,req.body.m3parts,req.body.m4parts]; 
    var parts=[ 
     [ 
      {mark:req.body.m1p1mark,content:req.body.m1p1content},{mark:req.body.m1p2mark,content:req.body.m1p2content}, 
      {mark:req.body.m1p3mark,content:req.body.m1p3content},{mark:req.body.m1p4mark,content:req.body.m1p4content}, 
      {mark:req.body.m1p5mark,content:req.body.m1p5content},{mark:req.body.m1p6mark,content:req.body.m1p6content}, 
      {mark:req.body.m1p7mark,content:req.body.m1p7content},{mark:req.body.m1p8mark,content:req.body.m1p8content}, 
      {mark:req.body.m1p9mark,content:req.body.m1p9content},{mark:req.body.m1p10mark,content:req.body.m1p10content} 
     ], 
     [ 
      {mark:req.body.m2p1mark,content:req.body.m2p1content},{mark:req.body.m2p2mark,content:req.body.m2p2content}, 
      {mark:req.body.m2p3mark,content:req.body.m2p3content},{mark:req.body.m2p4mark,content:req.body.m2p4content}, 
      {mark:req.body.m2p5mark,content:req.body.m2p5content},{mark:req.body.m2p6mark,content:req.body.m2p6content}, 
      {mark:req.body.m2p7mark,content:req.body.m2p7content},{mark:req.body.m2p8mark,content:req.body.m2p8content}, 
      {mark:req.body.m2p9mark,content:req.body.m2p9content},{mark:req.body.m2p10mark,content:req.body.m2p10content} 
     ], 
     [ 
      {mark:req.body.m3p1mark,content:req.body.m3p1content},{mark:req.body.m3p2mark,content:req.body.m3p2content}, 
      {mark:req.body.m3p3mark,content:req.body.m3p3content},{mark:req.body.m3p4mark,content:req.body.m3p4content}, 
      {mark:req.body.m3p5mark,content:req.body.m3p5content},{mark:req.body.m3p6mark,content:req.body.m3p6content}, 
      {mark:req.body.m3p7mark,content:req.body.m3p7content},{mark:req.body.m3p8mark,content:req.body.m3p8content}, 
      {mark:req.body.m3p9mark,content:req.body.m3p9content},{mark:req.body.m3p10mark,content:req.body.m3p10content} 
     ], 
     [ 
      {mark:req.body.m4p1mark,content:req.body.m4p1content},{mark:req.body.m4p2mark,content:req.body.m4p2content}, 
      {mark:req.body.m4p3mark,content:req.body.m4p3content},{mark:req.body.m4p4mark,content:req.body.m4p4content}, 
      {mark:req.body.m4p5mark,content:req.body.m4p5content},{mark:req.body.m4p6mark,content:req.body.m4p6content}, 
      {mark:req.body.m4p7mark,content:req.body.m4p7content},{mark:req.body.m4p8mark,content:req.body.m4p8content}, 
      {mark:req.body.m4p9mark,content:req.body.m4p9content},{mark:req.body.m4p10mark,content:req.body.m4p10content} 
     ] 
    ]; 

답변

0

var methodsArray=[[{mark:Number,content:String}]];methodsArray[0][0] 제외하고 아무것도하지 않는다 (경우에 내 오류가이 코드 내에 존재)입니다.

methodsArray[i][x] (또는 methodsArray[i])는 (i===0 제외한 경우와 x===0 [예컨대 i===0x==="push" 배열 방법 다시 제외하지만 그 점 꺼져]) undefined이다.

테스트 결과에 표시된 것처럼 루프가 methodsArray[0][0]이 아닌 다른 항목에 액세스하고 속성을 설정하려고합니다.

당신이 이동 요소를 만들 수 있습니다 원하는 경우 : methodsArray를 만들 때

var methodsArray = []; 
for(var i = 0; i < req.body.numOfMethods; i++) 
{ 
    methodsArray.push([]); 
    for(var x = 0; x< numOfParts[i]; x++) 
    { 
     methodsArray.push({ 
      mark: parts[i][x].mark, 
      content: parts[i][x].content 
     }); 
    } 
} 

이는 한 번 생각 할 것입니다.

또 다른 메모로서 나는 Typescript (또는 아마도 Flow?)를 쓰고있을 가능성이 있음을 깨달았습니다. 유형별 특수 효과는 =을 사용하지 않고 :을 사용하므로 var methodsArray:{mark:Number,content:String}[][]; 또는 var methodsArray:Array<Array<{ mark:number, content:string }>>;이어야합니다. Javascript에서 var methodsArray=[[{ mark:number, content:string }]];은 하나의 요소가있는 배열이고 다시 한 요소가 객체 인 배열입니다. 여기서 markNumber 생성자이고 contentString 생성자입니다.

+0

그래서이 문제를 해결하려면 methodsArray [i] [x] .mark.push (parts [i] [x] .mark); 할 필요가 있습니다. methodsArray [i] [x] .content.push (parts [i] [x] .content); 맞습니까? –

+0

아니, 문제는'methodsArray [i]'또는'methodsArray [i] [x]'가 정의되지 않았기 때문에 undefined에 속성을 설정할 수 없다는 것입니다. undefined에는 'push'도 없습니다. 예 : 'methodsArray [1] === undefined' 또는'methodsArray [0] [1] === undefined'입니다. 예를 들어하고 있습니다. 'methodsArray [1] [0] .mark' 이것은'undefined [0] .mark'로 변환됩니다. – ASDFGerte

+0

좋아요, 어떻게 정의할까요, 아니면 다른 방법으로할까요? –

관련 문제