Получение вызова API в node8.10 в Lambda приводит к Promise <pending>и неопределенному - PullRequest
1 голос
/ 09 апреля 2019

У меня есть лямбда-функция, написанная в Node8.1, в которой я пытаюсь получить массив объектов (фотографии серверов из API Unsplash), а затем записать их в DynamoDB.Прямо сейчас я не могу получить результаты моего вызова API, несмотря на цепочку обещаний.Любая помощь будет принята с благодарностью.

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

Promise {
  <pending>,
...

и

TypeError: Cannot read property 'results' of undefined
    at unsplash.search.photos.then.then.photos (/Users/stackery/Code/dynamodb-to-ses/src/writeToTable/index.js:19:12)
    at process._tickCallback (internal/process/next_tick.js:68:7)

Вот моя функция:

function getPhotos () {
  // get items from the unsplash api
  return unsplash.search.photos('servers')
  .then( photos => {
    toJson(photos)
  })
  .then( photos => {
    // filter out restaurant servers - that's not what we're going for
    photos.results.filter( photo => {
      return photo.description.includes('computer') || photo.alt_description.includes('computer') || photo.description.includes('data') || photo.alt_description.includes('data');
    }).then( photos => {
      return photos;
    });
  }).catch ( error => {
    console.log('Error getting photos');
    console.log(error);
  });
}

exports.handler = async () => {
  const results = await getPhotos();

  (other function logic)

  const response = {
    statusCode: 200,
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(results)
  };

  return response;
};

Я ожидаю массив объектов из API Unsplash (мои учетные данные не отображаются, но они верны, и я могу получить доступ к API).

* ***** РЕДАКТИРОВАТЬ: ***** *

Вот моя версия той же функции с асинхронным / ожидающим (которую я бы предпочел использовать):

async function getPhotos () {
  // get items from the unsplash api
  try {
    const photos = await unsplash.search.photos('servers', 1, 500); // get all 300+ photos
    const json = await toJson(photos);
    console.log(json); // this is working now, but filtering is not
    const serverPhotos = json;
    // filter out restaurant servers - that's not what we're going for
    return serverPhotos.results.filter(photo => {
      return photo.description.toLowerCase().includes('computer') || photo.alt_description.toLowerCase().includes('computer') || photo.description.toLowerCase().includes('data') || photo.alt_description.toLowerCase().includes('data') || photo.description.toLowerCase().includes('network');
    });
  }
  catch (error) {
    console.log('Error getting photos');
    console.log(error);
  }
}

exports.handler = async () => {
  const results = await getPhotos();
  ...
  return response;
};

Он также не работает и завершается ошибкой со следующей ошибкой:

Error getting photos
TypeError: Cannot read property 'filter' of undefined
    at getPhotos (/Users/stackery/Code/dynamodb-to-ses/src/writeToTable/index.js:18:18)
    at process._tickCallback (internal/process/next_tick.js:68:7)

Это то, что я ожидаю в ответ - массив таких объектов:

     [{ id: '6vA8GCbbtL0',
       created_at: '2019-03-14T13:39:20-04:00',
       updated_at: '2019-03-19T15:01:00-04:00',
       width: 3422,
       height: 4278,
       color: '#F8F7F7',
       description: 'Computer interior',
       alt_description: 'black and white computer tower',
       urls: [Object],
       links: [Object],
       categories: [],
       sponsored: false,
       sponsored_by: null,
       sponsored_impressions_id: null,
       likes: 35,
       liked_by_user: false,
       current_user_collections: [],
       user: [Object],
       tags: [Array],
       photo_tags: [Array] },
     ...
     ]

1 Ответ

1 голос
/ 09 апреля 2019

Эта часть вашей функциональной цепочки не возвращает объект Promise, поскольку return:

нет
  .then( photos => {
    toJson(photos)
  })

Попробуйте изменить это на

  .then( photos => {
    return toJson(photos)
  })

или даже просто .then(toJson), если вы чувствуете себя честолюбивым (:

В противном случае photos.results не определено

...