【问题标题】:Getting API call in node8.10 in Lambda results in Promise <pending> and undefined在 Lambda 中的 node8.10 中获取 API 调用会导致 Promise <pending> 和未定义
【发布时间】:2019-08-31 01:41:42
【问题描述】:

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

我已经尝试在我的函数中链接 Promise 以及 async/await,但不断收到以下错误:

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

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

这是我的相同功能的版本,带有 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;
};

它也无法正常工作,并出现以下错误:

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

【问题讨论】:

  • 尝试在photos.results.filter前面添加return
  • 你已经有了答案,这只是一个额外的建议。您是否也考虑过制作 getPhotos() async。然后在每次调用 Promise 时在 getPhotos() 中执行 await。你会减少嵌套。您还可以考虑将 catch 子句移至调用处理程序。
  • 我也尝试过异步/等待。我只是不完全理解它,因为我需要每一步的结果来做下一步。据我了解,异步函数不是同时运行每个步骤吗?
  • 我将我的 async/await 版本添加到原始问题中。

标签: javascript node.js lambda async-await es6-promise


【解决方案1】:

您的函数链的这一部分不会返回 Promise 对象,因为没有 return

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

尝试将其更改为

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

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

否则,photos.results 未定义

【讨论】:

  • 感谢您的关注!我添加了return,但现在得到了这个:TypeError: Cannot read property 'includes' of null at photos.results.filter.photo (/Users/stackery/Code/dynamodb-to-ses/src/writeToTable/index.js:19:32)
  • 我对@9​​87654329@ 对象的外观一无所知,所以很难说 - 听起来其中一个嵌套属性不存在
  • photos.results 应该是一个对象数组,每个对象都像这样:{ id: 'gRQXs2KjrAo', created_at: '2018-11-20T11:03:27-05:00', updated_at: '2019-03-27T18:51:50-04:00', width: 4000, height: 6000, color: '#64D0C1', description: 'Gaming computer', alt_description: 'black computer tower on table',...}
  • 当我尝试登录 toJson(photos) 时,我得到的是 Promise {&lt;pending&gt;, 而不是对象。
猜你喜欢
  • 2021-05-08
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多