首页 > 解决方案 > 如何使用nodejs 10x在aws lambda中将发布请求发送到外部api?

问题描述

我正在尝试使用 nodejs 10.x 将发布请求发送到 aws lambda 中的外部 api。但我收到错误

Response:
{
  "errorMessage": "Converting circular structure to JSON",
  "errorType": "TypeError",
  "stackTrace": []
}

请在下面找到代码:

const http = require('https');

exports.handler = async (event) => {
    return new Promise((resolve, reject) => {

        const req = http.request('https://jsonplaceholder.typicode.com/posts', (res) => {
            resolve(res);
        });

        req.on('error', (e) => {
          reject({error: e.message});
        });

        // send the request
        req.write('');
        req.end();
    });
};

我期待像下面这样的json响应

[
  {
    "userId": 1,
    "id": 1,
    "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
    "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
  },
  {
    "userId": 1,
    "id": 2,
    "title": "qui est esse",
    "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
  }
]

标签: node.jsaws-lambda

解决方案


You are using http.request without adding options object but a URL. You should replace it with http.get or add options object.

You are also resolving response from http request without building the data. If you are using Lambda behind API Gateway proxy integration then response should be formatted. Following code should work.

const http = require('https');

let getData = () => {

  return new Promise((resolve, reject) => {

    http.get('https://jsonplaceholder.typicode.com/posts', (resp) => {

      let data = '';

      resp.on('data', (chunk) => {
        data += chunk;
      });

      resp.on('end', () => {
        resolve(data);
      });
    }).on('error', (e) => {
      console.log('Error', e.message);
      reject(e);
    });
  });
};

module.exports.handler = async (event) => {

  try {
    // Data is string.
    const data = await getData();
    return {
      statusCode: 200,
      body: data
    }
  }
  catch (e) {
    console.log(e);
    return {
      statusCode: 400,
      body: e.message
    }
  }
};

推荐阅读