【问题标题】:Node JS ignores undefined checkNode JS 忽略未定义的检查
【发布时间】:2016-12-01 22:31:58
【问题描述】:

我正在开发一个 NodeJs 应用程序,该应用程序从 FB 获取事件并将其放入本地数据库。对于 api 查询第一页中的每个事件,除了最后一个之外,这一切都很好。

我收到以下错误:

[2016 年 12 月 1 日,下午 1:48:39] 类型错误:无法读取属性“名称” 未定义的 在传入消息。 (/home/node/virgo/app.js:217:32) 在 IncomingMessage.emit (events.js:129:20) 在 _stream_readable.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();
}

查看图表 api explorer 了解中断事件:Graph API

事件代码:1682486658666506

我尝试捕获未定义的 json 对象但没有成功,我还尝试使用此解决方案验证 json:Stackoverflow validate JSON javascript

【问题讨论】:

  • 我用更多信息更新了我的答案。
  • 它正在正确检查未定义,但您在此处遇到错误var eventPlace = json.place.name;

标签: javascript json node.js facebook-graph-api https


【解决方案1】:

尝试使用request,而不是https.request

它将为您提供解析的 JSON,您不必手动进行。

如果您想像您一样手动执行此操作,请记住将 var json = JSON.parse(resultBody); 包装在 try/catch 块中(或使用 tryjson),因为 JSON.parse 不能用于 try/ 之外的未知数据catch - 它可以抛出异常。

另外,不要在路由处理程序中打开数据库连接。您应该打开一次连接,然后在您的处理程序中使用它。有关更多信息,请参阅this answer

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

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

你可以改变这个:

var eventPlace = json.place.name;

到这里:

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

您还必须在访问 json.photos.data 之前检查 json.photos 并测试 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 是非空数组但json.photos.data[json.photos.data.length-1].images[0].source 未定义。

如您所见,您在这里做了很多假设。如果不满足这些假设,代码就会失败。

【讨论】:

  • 很多有用的信息谢谢你,幸运的是我可以对数据进行一些假设,因为我们是在 facebook 上制作事件的人。这个地方不可用是一个异常现象,在未来的事件中不会发生。但是,对人为错误进行一些检查可能确实是一件明智的事情。
猜你喜欢
  • 2022-08-15
  • 2013-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 2015-08-09
相关资源
最近更新 更多