Мне нужно добавить список из этих вложенных функций в Express, но элементы не будут храниться - PullRequest
0 голосов
/ 08 февраля 2020

Я имею дело с тремя вложенными функциями, и последняя не возвращает список элементов, которые я хочу. Если я регистрирую в консоли результаты последней функции изнутри l oop, я вижу нужные URL-адреса, но только внутри l oop функции. Он не хранит их в списке или JSON ни для чего. Возвращает только пустой список или пустой JSON.

  • Первая функция - это просто вызов URL ('/ api / getList'), который работает нормально.
  • Вторая функция вызывает последние сообщения со страницы Facebook. Это возвращает идентификаторы постов, и я помещаю их в список просто отлично.
  • Третья функция - это еще один вызов Facebook, который использует идентификаторы сообщений для запроса URL-адреса фотографии из указанных сообщений. Это возвращает и консоль регистрирует URL-адреса, но я не могу сохранить их ни к чему. Как ни странно, когда я консоль журнала «я» в последней функции, он возвращает «25» двадцать пять раз. Двадцать пять - это количество сообщений, количество возвращаемых URL-адресов изображений.

Первая функция вызывается один раз. Вторая функция вызывается один раз. Третья функция вызывается двадцать пять раз.

Если вам интересно, почему у меня есть два цикла for, которые должны делать одно и то же, то это потому, что я подумал, что это могло решить проблему. У меня были такие же результаты с одним l oop.

const FB = require('fb')

var image_urls = []
app.get('/api/getList', (req, res1) => {
  FB.api('4300000000643', { fields: 'posts' }, function (res2) {
      if(!res2 || res2.error) {
        console.error(!res2 ? 'error occurred' : res2.error);
        return;
      }
      post_id = res2.posts.data.map(post => post.id)

      for (var i = 0; i < post_id.length; i++) {
        console.log(i)
        FB.api(
          "/"+post_id[i]+"/attachments",
          function (res3) {
            if(!res3 || res3.error) {
              console.error(!res3 ? 'error occurred' : res3.error);
              return;
            }
              // this doesn't seem to do anything
              image_urls.push(res3.data[0].media.image.src)

              // this logs all the URLs I want
              // console.log(res3.data[0].media.image.src)

              // this logs '25' twenty five times for some reason
              console.log(i)                
          }
        );
      }
      // this returns the array of post ids
      console.log(post_id)

      // this returns an empty list
      console.log(image_urls)

    });

  });

'FB.api' из библиотеки 'NodeJS для Facebook'

FB.api("/"+post_id[i]+"/attachments", вызывается в последней функции, которую я получил из документации Facebook здесь. Похоже, она не дает никакой информации о том, какая именно это функция. В пакете Facebook Node нет документации о том, как запрашивать информацию об отдельных сообщениях, которые я видел.

Начиная с Python и будучи новичком в Express / Node, это действительно сбивает с толку, и я буду интересно узнать у вас, что здесь происходит.

1 Ответ

1 голос
/ 08 февраля 2020

Вы имеете дело с асинхронной обработкой, поэтому вам придется отслеживать, сколько результатов вы должны получить, и выполнять «то, что нужно сделать со всеми URL-адресами изображений», как только вы действительно получите все из них:

const globalImageList = [];
app.get(`/api/getList`, (req, res) => {
  FB.api(`4300000000643`, { fields: `posts` }, postData => {
    if (!postData || postData.error) {
      console.error(!postData ? `error occurred` : postData.error);
      return res.status(500).write(`server error of some sort`);
    }

    const processList = postData.posts.data.map(post => post.id);
    let resultCount = 0;

    processList.forEach(post_id => {
      FB.api(`/${post_id}/attachments`, imageData => {
        resultCount++;

        if (!imageData || imageData.error) {
          return console.error(!imageData ? `error occurred` : imageData.error);
        }

        const url = imageData.data[0].media.image.src;
        if (url) {
          globalImageList.push(url);
        }

        // Do we have all the images we needed?
        if (resultCount === processList.length) {
          console.log(`Image URLs:`, globalImageList);
          sendImageList(res);
        }
      });
    });
  });
});

Где function sendImageList(res) делает все, что вам нужно, для этого нужно (отправьте простой текст, json, html, xml и др. c.).

Также следует учесть: не тратьте время на повторную загрузку тех же данных, поэтому, прежде чем нажать FB.api, проверьте, заполнен ли globalImageList. Если это так, немедленно res.write ответ (или какой API вы используете для формирования правильно сформированных ответов, на которые опирается остальная часть вашего кода) и возврат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...