在Lambda的node8.10中获得API调用会导致Promise< pending>和未定义 [英] Getting API call in node8.10 in Lambda results in Promise <pending> and undefined

查看:120
本文介绍了在Lambda的node8.10中获得API调用会导致Promise< pending>和未定义的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个用Node8.1编写的Lambda函数,在该函数中,我试图获取一个对象数组(来自Unsplash API的服务器照片),然后将它们写入DynamoDB.尽管有链接承诺,但现在我无法获得API调用的结果.任何帮助将不胜感激.

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. Right now I can't get the results of my API call, despite chaining promises. Any help would be greatly appreciated.

我已经在函数中尝试了链接promise和async/await,但是始终出现以下错误:

I've tried chaining promises as well as async/await in my function, but keep getting the following errors:

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

我希望Unsplash API中有一系列对象(我的凭据未显示,但它们是正确的,我可以访问API).

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).

* ********** *

这是我相同功能的版本,带有async/await(我想使用):

Here is my version of the same function, with async/await (which I would prefer to use):

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

推荐答案

由于没有return,因此该函数链的这一部分不返回Promise对象:

This part of your function chain does not return a Promise object since there is no return:

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

尝试将其更改为

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

,或者只是.then(toJson)(如果您有雄心壮志(:

or even just .then(toJson) if you're feeling ambitious (:

否则,未定义photos.results

这篇关于在Lambda的node8.10中获得API调用会导致Promise&lt; pending&gt;和未定义的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆