Node & Angular, вызов Feedly RSS API, получение данных из сервиса и передача контроллеру. Обратный вызов или формирование URL-адреса с заголовком авторизации для запроса https.get()

У меня есть файл controller.js, который я пытаюсь получить из моего файла feed-service.js. FEEDLY_USER_ID и FEEDLY_ACCESS_TOKEN доступны и определены в отдельном файле config.js.

контроллер.js:

$scope.feedlyGlobalAll = FeedService.getGlobalAll();

фид-service.js:

var request = require('request');
var globalOptions = {
    url: 'https://cloud.feedly.com/v3/streams/contents?streamId=user/' + FEEDLY_USER_ID + '/category/global.all',
    auth: {
        'bearer': FEEDLY_ACCESS_TOKEN
    }
};

service.getGlobalAll = function(){
    request.get(globalOptions, function(error, response, body){
        if(!error && response.statusCode == 200){
            service.globalAll = JSON.parse(body);
            return service.globalAll;
        }
        // error code here //
   })
}

Я использую пакет npm под названием «запрос», чтобы сделать GET, потому что я не мог заставить работать https.get(). Для этого вызова API Feedly требуется URL-адрес, мой идентификатор пользователя и токен доступа, переданные в заголовке.

Я читал, и, видимо, я должен использовать обратные вызовы или обещания, но я не могу заставить их работать. С помощью http.get() я могу использовать промисы с помощью http.get().then(yada yada), которые работают для вызова прогноза.io, который я делаю в другом месте. Модуль запроса, по-видимому, не разрешает .then(). Обычно я сталкиваюсь с TypeError, а .then() не является функцией.

Когда я пытался выполнить https.get(), вот код, который я использовал. Я никогда не был в состоянии получить успешный ответ.

var url = {
    url: 'https://cloud.feedly.com/v3/streams/contents?streamId=user/' + FEEDLY_USER_ID + '/category/global.all',
    'headers': {
        'Authorization': 'Bearer ' + FEEDLY_ACCESS_TOKEN
    }
};

https = require('https');
https.get(url).then(yada yada)

Я пробовал множество вещей в URL-адресе var для вызова https.get. Я пробовал с кавычками и без них, я пробовал только auth: токен на предъявителя, поскольку он работает с модулем запроса, но не смог заставить его работать.

Решение этой проблемы будет либо:

  1. Обратный вызов от фид-сервиса к контроллеру с использованием существующего кода модуля запроса.
  2. Выяснение правильного способа формирования URL-адреса для запроса https.get, а затем я могу использовать его функцию обещания.

person Joe LaMag Reiter    schedule 21.01.2016    source источник


Ответы (1)


Используйте обещание внутри обратного вызова вашего запроса:

service.getGlobalAll = function() {
   return $q(function(resolve, reject) {
      request.get(globalOptions, function(error, response, body){
         if(!error && response.statusCode == 200){
            service.globalAll = JSON.parse(body);
            resolve(service.globalAll);
        } else {
          reject();
        }
     });
   });
};

$q (угловой API обещания) может быть внедрен как зависимость в вашем сервисе. Приведенный выше код вернет обещание, которое будет разрешено, когда вернется вызов ajax вашей библиотеки, поэтому вы можете получить к нему доступ с помощью .then().

person tanenbring    schedule 21.01.2016
comment
Я сейчас занимаюсь $ q не определено. Я добавил в свой контроллер: function controller($scope, $q) Но это не сработало. - person Joe LaMag Reiter; 22.01.2016
comment
Ах! Пришлось добавить его в мой файл feed-service.js. функция FeedService($http, $q). Не знал о обещании API $q. Большое спасибо!! - person Joe LaMag Reiter; 22.01.2016