【问题标题】:Cannot set propert of 'mark' to undefined无法将“标记”的属性设置为未定义
【发布时间】:2016-10-03 22:12:56
【问题描述】:

这是一个奇怪的错误,因为它看起来是错误的,错误是:

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}
        ]
    ];

【问题讨论】:

    标签: javascript arrays mongodb mongoose


    【解决方案1】:

    var methodsArray=[[{mark:Number,content:String}]]; 除了methodsArray[0][0] 之外什么都没有。

    methodsArray[i][x](甚至methodsArray[i])是undefinedi===0x===0 除外[数组方法除外,例如i===0x==="push",但这不是重点])。

    如您的测试输出所示,您的循环正在访问 methodsArray[0][0] 以外的其他内容并尝试设置属性。

    如果您愿意,您可以随时随地创建元素:

    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
            });
        }
    }
    

    这只能在创建 methodsArray 时执行一次。

    另外,我意识到您可能正在编写 Typescript(或者 Flow?)。类型注释不使用=,而是使用:,因此它需要是var methodsArray:{mark:Number,content:String}[][];var methodsArray:Array&lt;Array&lt;{ mark:number, content:string }&gt;&gt;;。在 Javascript 中,var methodsArray=[[{ mark:number, content:string }]]; 是一个包含一个元素的数组,一个包含一个元素的数组,它是一个对象,其中属性 markNumber 构造函数,contentString 构造函数。

    【讨论】:

    • 所以要解决这个问题,我需要做 methodsArray[i][x].mark.push(parts[i][x].mark);方法数组[i][x].content.push(parts[i][x].content);对吗?
    • 不,您的问题是 methodsArray[i]methodsArray[i][x] 未定义,您无法在未定义上设置属性。 undefined 上也没有push。例如。 methodsArray[1] === undefinedmethodsArray[0][1] === undefined。你正在做例如methodsArray[1][0].mark 转换为 undefined[0].mark 不起作用。
    • 好的,我将如何定义它或者我会以另一种方式来做?
    • 您的问题是methodsArray,您将其设置为[[{mark:Number,content:String}]];,但稍后使用它,就好像数组中有更多元素一样。您需要在设置 methodsArray 时添加所有元素,或者在旅途中创建元素。我在答案中添加了示例代码。看起来这是 Typescript 还是 Flow 之类的?
    • 如何“随时随地创建元素”?
    猜你喜欢
    • 2012-06-24
    • 2021-11-27
    • 2022-10-30
    • 2023-02-10
    • 2015-12-07
    • 2013-05-28
    • 2016-02-23
    • 2011-11-20
    相关资源
    最近更新 更多