nodeJS - 无法设置 undefined 的属性

nodeJS - Cannot set property of undefined

提问人:Florian Rahmann 提问时间:11/9/2022 更新时间:11/9/2022 访问量:848

问:

我知道这个问题可能会在这里被问到 1000 次,但我在我的脚本中找不到错误。 我正在尝试遍历 2 个数组以从 each() 循环中的 city_id 和 organisation_id 中获取名称。我想将值写入“mother”对象,以便在一个地方获取所有信息。这是我到目前为止编写的代码:

let express = require('express');
let router = express.Router();
let request = require('request');
let connection = require('../lib/mysql');

router.get('/', function(req, res) {
    if(req.session.loggedin === true){
        getList((err, finlist) => {
           console.log(finlist)
        });
    } else {
        const cssPath = '/stylesheets/style.css'
        res.render('login', { cssPath, title: 'Login' });
    }
});

function getList(callback) {
    var result = [];
    connection.query('SELECT * FROM lists ', (err, rows) => {
        if(err) throw err;
        var r=0;
        rows.forEach(function(item) {
            result[r] = item;
            getCities((err, cty) => {
                result[r].city = cty[item.city_id].name;
                getOrganisations((err, org) => {
                    result[r].organisation = org[item.organisation_id].name;
                });
                callback(result);
            });
            r++;
        });
    });
}

function getCities(callBack) {
    var result=[];
    connection.query('SELECT * FROM cities ', (err, rows) => {
        if (err) throw err;
        rows.forEach(function (cty) {
            result[cty.id] = cty;
        });
        if (err) {
            callBack(err, null);
        } else {
            callBack(null, result);
        }
    });
}
function getOrganisations(callBack) {
    var result=[];
    connection.query('SELECT * FROM organisations ', (err, rows) => {
        if(err) throw err;
        rows.forEach(function(org) {
            result[org.id] = org;
        });
        if (err) {
            callBack(err, null);
        } else {
            callBack(null, result);
        }
    });
};

module.exports = router;

我总是收到错误

TypeError: Cannot set properties of undefined (setting 'city')
    at /opt/alarmprocessor/routes/settings.js:53:32
    . . .

这是哪条线result[r].city = cty[item.city_id].name;

国王问候帮助我:)

尝试将其设置为数组,作为对象,使控制台输出无处不在......似乎一切都很好。.也许我对 NodeJS 太陌生了,所以它还没有在我的脑海中点击;D

node.js 数组表示 对象 回调

评论


答:

0赞 Paul-Marie 11/9/2022 #1

发生此错误的原因是第 53 行不存在。它被声明了,但并不“存在”——>它是 .如果您只执行第 52 行,您将得到一个 ,并且您不能将属性(如 )设置为值。 快速解决方法是使用可选的链接,如下所示:result[r]undefinedconsole.log(result[r]);undefinedcityundefined

result[r]?.city = cty[item.city_id].name;

它不会修复你的代码,它只会通过忽略赋值来停止崩溃。