javascript - Node JS 忽略未定义的检查

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

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

我收到以下错误:

[December 1st 2016, 1:48:39 pm] TypeError: Cannot read property 'name' of undefined at IncomingMessage. (/home/node/virgo/app.js:217:32) at IncomingMessage.emit (events.js:129:20) at _stream_readable.js:907:16 at 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 浏览器以了解中断事件:Graph API

事件代码:1682486658666506

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

最佳答案

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

它将为您提供解析后的 JSON,您无需手动执行此操作。

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

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

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

此外,该错误可能不是因为 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 未定义。

正如您所看到的,您在这里做了很多假设。当不满足这些假设时,代码将失败。

关于javascript - Node JS 忽略未定义的检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40912653/

相关文章:

javascript - 事件监听器没有触发?

c# - 我有 JSON 响应具有不同名称的对象,但所有对象都具有相同的变量

angularjs - 文件上传 : create directory if it doesnt exist

javascript - 超出范围时如何返回 promise ?

javascript - EJS 和 Express - 如何将数据传递给标签属性?

javascript - 如何在php中将动态创建的表中的数据更新到数据库

javascript - 使用js和后退按钮切换类

javascript - 扩展 jQuery 插件并更改默认值

java - HttpURLConnection:如何读取 400 响应的有效负载

javascript - 在 Angularjs 中将 Javascript 对象转换为 JSON 一次