2017-01-14 6 views
1

я получаю TypeError: Cannot read property 'first_name' of undefined при попытке выполнить этот код (все переменные, в том числе модули, определенные в других частях кода):TypeError: Не удается прочитать свойство «first_name» неопределенной

if (messageText) { 
      var senderID_first_name = f_User.UserQ(senderID); 
      sendTextMessage(senderID, String(senderID_first_name)); 
     } 

f_User = { 
    UserQ: function(id) { 
     var parse_body; 
     request.get('https://graph.facebook.com/v2.6/'+id+'?fields=first_name,last_name,profile_pic,locale,timezone,gender&access_token='+PAGE_ACCESS_TOKEN, function(error, response, body) { 
      if (!error && response.statusCode == 200) { 
       parse_body = body; 
      } 
     }); 
     return parse_body.first_name; 
    } 
} 

ответ

1

запускали в типичная проблема с асинхронным поведением JS. Вы возвращаете дату, которой у вас еще нет. Данные, которые вы хотите, находятся в обратном вызове метода get.

Вы можете решить это в своей архитектуре следующим образом.

UserQ: function(id, callback) { 
    var parse_body; 
    request.get('https://graph.facebook.com/v2.6/'+id+'?fields=first_name,last_name,profile_pic,locale,timezone,gender&access_token='+PAGE_ACCESS_TOKEN, function(error, response, body) { 
     if (!error && response.statusCode == 200) { 
      callback(parse_body.first_name); 
     } 
    }); 
} 

, а затем

... 
UserQ(2, function(name){ 
console.log('Name for id 2', name); 
}); 
... 

Вы должны изучить о callbacks and promises в JS. Удачи :-)

P.S: Смотрите этот пример: http://jsbin.com/jagisumode/edit?js,console

+0

Благодарим за ответ. Я попробовал это, и я продолжаю получать неопределенные взамен (по крайней мере, это не сбой!). ', если (MessageText) { f_User.UserQ (SenderId, функция (senderID_first_name) { sendTextMessage (SenderId, String (senderID_first_name)); }); } '' –

+0

'f_User = { UserQ: функция (идентификатор, обратный вызов) { request.GET ('https://graph.facebook.com/v2.6/'+id+'?fields=first_name, last_name, profile_pic, locale, timezone, gender & access_token = '+ PAGE_ACCESS_TOKEN, функция (ошибка, ответ, тело) { if (! error && response.statusCode == 200) { console.log (body.first_name); callback (body.first_name); } }); } } ' –

+0

' console.log (body.first_name); 'undefined? Что же тогда возвращает «тело»? – jukben

0

Я надеюсь, что это будет работать для вас, не тестируется на моем конце.

if (messageText) { 
    f_User.UserQ(senderID,true); 
} 
f_User = { 
    UserQ: function(id,sendMessage=false) { 
     request.get('https://graph.facebook.com/v2.6/'+id+'?fields=first_name,last_name,profile_pic,locale,timezone,gender&access_token='+PAGE_ACCESS_TOKEN, function(error, response, body) { 
      if (!error && response.statusCode == 200) { 
       if(sendMessage)    
        sendTextMessage(id, String(body.first_name)); 
      } 
     }); 
    } 
} 
Смежные вопросы