简体   繁体   English

在 Lambda 中的 node8.10 中获取 API 调用导致 Promise<pending> 和未定义

[英]Getting API call in node8.10 in Lambda results in Promise <pending> and undefined

I have a Lambda function written in Node8.1 in which I'm trying to get an array of objects (photos of servers from the Unsplash API), then write them to DynamoDB.我有一个用 Node8.1 编写的 Lambda 函数,我试图在其中获取一组对象(来自 Unsplash API 的服务器照片),然后将它们写入 DynamoDB。 Right now I can't get the results of my API call, despite chaining promises.尽管链接了承诺,但现在我无法获得 API 调用的结果。 Any help would be greatly appreciated.任何帮助将不胜感激。

I've tried chaining promises as well as async/await in my function, but keep getting the following errors:我已经尝试在我的函数中链接 promise 和 async/await,但不断收到以下错误:

Promise {
  <pending>,
...

and

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)

Here is my function:这是我的功能:

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;
};

I expect an array of objects from the Unsplash API (my credentials are not shown but they are correct and I can access the API).我期望来自 Unsplash API 的对象数组(我的凭据没有显示,但它们是正确的,我可以访问 API)。

* *****EDIT:***** * * *****编辑:***** *

Here is my version of the same function, with async/await (which I would prefer to use):这是我的相同功能的版本,带有 async/await(我更喜欢使用):

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;
};

It's also not working, and failing with the following error:它也不起作用,并因以下错误而失败:

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)

This is what I'm expecting back - an array of objects like this one:这就是我所期待的 - 像这样的一组对象:

     [{ 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] },
     ...
     ]

This part of your function chain does not return a Promise object since there is no return :函数链的这一部分不返回Promise对象,因为没有return

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

Try changing that to尝试将其更改为

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

or even just .then(toJson) if you're feeling ambitious (:或者甚至只是.then(toJson)如果你感觉雄心勃勃(:

Otherwise, photos.results is not defined否则, photos.results未定义

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM