当前位置: 首页 > 面试题库 >

节点JS忽略未定义的检查

羊舌旭尧
2023-03-14
问题内容

我正在开发一个NodeJs应用程序,该应用程序从FB接收一个事件并将其放入本地数据库。对于api查询首页中的每个事件,除最后一个事件外,一切正常。

我收到以下错误:

[2016年12月1日,下午1:48:39]
TypeError:无法读取IncomingMessage上未定义的属性“名称”。(/home/node/virgo/app.js:217:32)在IncomingMessage.emit(events.js:129:20)在_stream_read.js:907:16在process._tickCallback(node.js:372:11)

刚过

console.log(resultBody);

码:

function addFBEvent(facebookId){
console.log("getting event: " + facebookId);

var options = {
    hostname: 'graph.facebook.com',
    port: 443,
    path: '/v2.8/'+facebookId+'?fields=name,description,start_time,end_time,place,photos{images}&access_token={INSERT API ACCESS CODE HERE}',
    method: 'GET'
};

https.request(options, function(res2) {
    var resultBody = "";
    res2.setEncoding('utf8');
    res2.on('data', function (chunk) {
        resultBody = resultBody + chunk;
    });

    res2.on('end', function () {
        dbConnection = sql.createConnection({
                                host     : settings.dbHost,
                                user     : settings.dbUser,
                                password : settings.dbPassword
                            });

        dbConnection.connect(function(err){
                if(!err) {
                    console.log("Database is connected ... nn");
                } else {
                    console.log("Error connecting database ... nn");
                }
        });

        var json = JSON.parse(resultBody);

        console.log(resultBody);

        if (json != undefined){
            var eventName = json.name;
            var eventStart = json.start_time;
            var eventEnd = json.end_time;
            var eventDescription = json.description;
            var eventPlace = json.place.name;
            var eventPoster = json.photos.data[json.photos.data.length-1].images[0].source;
            var eventId = json.id;

            console.log("name: " + eventName + ", start: " + eventStart + ", end: " + eventEnd + ", place: " + eventPlace + ", Poster: " + eventPoster);
            //console.log("Description: " + eventDescription);

            dbConnection.query('INSERT INTO SVVirgo.activities(title, description, image, start, end, price, location, facebook) VALUES ("'+eventName+'","'+eventDescription+'","'+eventPoster+'","'+eventStart+'","'+eventEnd+'",0,"'+eventPlace+'","'+eventId+'")', function (err, result){

            });
        }

        dbConnection.end();
    })
}).end();
}

有关中断事件,请参见graph api资源管理器:Graph
API

场次编码:1682486658666506

我试过没有运气地捕获未定义的json对象,我也尝试使用此解决方案来验证json:Stackoverflow验证JSON
javascript


问题答案:

而不是https.request尝试使用request

它将为您提供解析的JSON,而您无需手动进行。

如果您希望像手动操作那样手动操作,请记住将其包装var json = JSON.parse(resultBody);在try /
catch块中(或使用tryjson),因为JSON.parse不能在try
/ catch之外的未知数据上使用-可能引发异常。

另外,不要在路由处理程序中打开数据库连接。您应该打开一次连接,然后在处理程序中使用它。。

现在要连接到数据库,但你继续连接回调外,让您从开始的所有行var json = JSON.parse(resultBody); 之前
建立的数据库连接。

此外,错误可能不是因为json未定义而是因为json.place未定义。

您可以更改此:

var eventPlace = json.place.name;

对此:

var eventPlace = json.place && json.place.name;

您还必须json.photos在访问之前检查json.photos.data并测试是否json.photos.data为数组,然后再将其视为此类(可以使用以下方法进行处理:

if (json.photos && Array.isArray(json.photos.data)) {
  // ...
}

基本上,您需要在访问它们之前确保值是您想要的值。例如访问此:

json.photos.data[json.photos.data.length-1].images[0].source

json未定义,何时json.photos未定义,何时json.photos.data未定义,何时json.photos.data不是数组,何时json.photos.data.length为零,何时json.photos.data[json.photos.data.length-1]未定义,何时json.photos.data[json.photos.data.length-1].images未定义,何时json.photos.data[json.photos.data.length-1].images不是数组,何时json.photos.data[json.photos.data.length-1].images为数组但为空或何时json.photos.data[json.photos.data.length-1].images为a
时,可能失败非空数组,但json.photos.data[json.photos.data.length-1].images[0].source未定义。

如您所见,这里有很多假设。如果不满足这些假设,则代码将失败。



 类似资料:
  • 问题内容: 从节点手册中,我可以使用来获得文件的目录,但是从REPL中,这似乎是未定义的。这是我的误解还是错误在哪里? 问题答案: 仅在脚本中定义。在REPL中不可用。 尝试制作脚本 并运行它: 您将看到打印。 添加了背景说明:表示“此脚本的目录”。在REPL中,您没有脚本。因此,将没有任何实际意义。

  • 我试图定义一些endpoint,并使用进行测试。在中,我有: 但是当我运行时,我会得到以下错误: 我如何解决这个问题?

  • 我收到此意外错误nodejs(Express)。每当我需要控制台时。文件或请求。文件,未定义为控制台 三个文件如下: 用于注册 处理所有multer配置 所有文件的父级

  • tran.js 错误 (节点:12012)未处理的PromisejectionWarning:未处理的promise拒绝(拒绝id:1):TypeError:无法读取未定义(节点:12012)[DEP0018]弃用警告:未处理的promise拒绝被弃用。将来,未处理的promise拒绝将终止节点。具有非零退出代码的js进程。 我不知道该怎么办

  • 下午好,我是新反应和Node.js和我有一个问题。 我在一个网页上有一个表格,你将在那里收到旅行的数据。travel_order模型中存在这些列(Id locales、name、date、time),但是“lockations name”列旨在使用Id列出这些地方的名称。此位置的ID在“地点ID”列中列出。但是,在列出时,它给我一个错误:“TypeError:不能读取未定义的属性'Designac

  • 我试着学习节点。js(ES6)但在 这是我的结构: BaseModel.js 会计模型。js 主要的js 现在我运行: 和获取错误: ReferenceError:对象上未定义BaseModel。(/Users/tamirscherzer/POC/projects/NodeJS/tutorials/classes/AccountModel.js:5:28)在模块中_在对象处编译(module.js