我正在开发一个 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/