2015-10-25 8 views
0

У меня есть запрос на следующий вызов в моем Node.js приложениеСоздание запроса API с использованием запроса модуля в Node.js приложение

request({ url:chanURL, qs:chanProperties}, function(err, response, body) { 
     if(err) { console.log(err); return; } 
     body = JSON.parse(body); 

     (function (body) { 
     Object.keys(body.items).forEach(function(item) { 
      pid = item.contentDetails.relatedPlaylists.uploads; 
      console.log(pid); 
     }) 
     })(); 
    }) 

И я получаю TypeError: Cannot read property 'items' of undefined при обработке ответа.

объект JSON, что я пытаюсь работать с это

{ kind: 'youtube#channelListResponse', 
    etag: '"0KG1mRN7bm3nResDPKHQZpg5-do/B7stMlWJTBpmW2q34yWKIzz8fF8"', 
    pageInfo: { totalResults: 1, resultsPerPage: 1 }, 
    items: 
    [ { kind: 'youtube#channel', 
     etag: '"0KG1mRN7bm3nResDPKHQZpg5-do/vV2FFZUI5inz53NuQDJMTs3tdQk"', 
     id: 'UCwy6X3JB24VTsDFqMwdO5Jg', 
     contentDetails: [Object] } ] } 

Почему говорят items неопределен?

И еще я хотел бы знать, хочу ли я выполнить функцию внутри этой оболочки запроса, мне нужно обернуть ее внутри скобки, как я сделал? Я получил синтаксическую ошибку без скобок.

ответ

3

Есть несколько проблем с кодом:

(function (body) { /* ... */ })() 

Вы звоните анонимную функцию без аргумента. body есть поэтому undefined внутри функция. Вы должны опустить IIFE - вам это не поможет.

Object.keys(body.items) 

Object.keys возвращает массив имен свойств для объекта. body.items - это массив, поэтому вам не нужно его использовать - вы должны перебирать объект напрямую.

pid = item.contentDetails.relatedPlaylists.uploads 

contentDetails - это массив. Если вы имеете в виду использовать первый элемент, код должен прочитать: item.contentDetails[0].relatedPlaylists.uploads

внесение этих изменений оставляет вас с:

request({ url:chanURL, qs:chanProperties}, function(err, response, body) { 
    if(err) { console.log(err); return; } 
    body = JSON.parse(body); 

    body.items.forEach(function(item) { 
     pid = item.contentDetails[0].relatedPlaylists.uploads; 
     console.log(pid); 
    }) 
}) 
+0

Благодарит Вас за содержательный ответ, это действительно полезно. Не могли бы вы добавить, как я могу структурировать, чтобы я мог вызвать другой вызов запроса в цепочке или использовать обратный вызов? Теперь у меня есть идентификатор плейлиста моего Youtube, мне нужно сделать другой похожий запрос, чтобы получить список видео, используя этот идентификатор плейлиста. Я знаю, как получить видео, но я не уверен, как собрать эти два запроса, чтобы в конечном итоге получить видеоданные. –

 Смежные вопросы

  • Нет связанных вопросов^_^