AWS和NodeJ对外部api的http请求

时间:2019-07-19 20:21:28

标签: node.js rest aws-lambda

只需尝试NodeJ和AWS Lambda。到目前为止,我设法使用Serverless来构建所有堆栈并创建网关和Lambda。现在,我正在努力进行一些简单的事情,调用一个外部API。

我尝试了一些代码,以及在Stackoverflow上找到的其他代码,但到目前为止,我都失败了,所有这些代码都向浏览器返回了一个内部服务器错误消息。这些是我认为得到最接近结果的代码:

代码示例1:

import { Handler, Context, Callback } from 'aws-lambda';
import http from 'https';
    const regioes: Handler = (event: any, context: Context, callback: Callback) => {
      var url: string = 'https://servicodados.ibge.gov.br/api/v1/localidades/regioes';
      https.get(url, function(res) {
        var data = '';
        res.on('data', (chunk) => { data += chunk; }); 
        res.on('end', () => { console.log("BODY: " + data); });
        }).on('error', (e) => { console.log("Got error: " + e.message);});

    };
    export {regioes}

代码示例2:

import { Handler, Context, Callback } from 'aws-lambda';
import http from 'https';
const regioes: Handler = (event: any, context: Context, callback: Callback) => {
  var url: string = 'https://servicodados.ibge.gov.br/api/v1/localidades/regioes';
  let body: any;
  let response: httpResponse = {
    statusCode: 200,
    body: JSON.stringify({
      message:'Variavel response inicializada', test: 'i am a text'
      }),
    isBase64Encoded: false
  };
  console.log('resposta padrao', response);
  var reqOptions: https.RequestOptions = {
    host: 'servicodados.ibge.gov.br',
    path: '/api/v1/localidades/regioes',
    method: 'GET'
  }
  var req = https.request(reqOptions, res => {
    console.log("statusCode: ", res.statusCode);
    res.on('data', function (chunk) {
      body += chunk;
  });
    res.on('end', () => {
       response = {
          statusCode: 200,
          body: JSON.stringify({message: 'test'}),
          isBase64Encoded: false
      };

    });
  }).on('error', (err) => {
    console.log(err);
    response = {
      statusCode: 500,
      body: JSON.stringify ({ message: err.message}),
      isBase64Encoded: false
    }

  });
  req.end();
  callback(null, response);
};

export {regioes}

我知道代码示例1缺少主体的返回,没有在其中添加它,因为我试图检查CloudWatch上的返回是否有任何不同,两者都相同,没有错误,但是都没有我添加的控制台日志消息。

如果您在我的代码上调用端点,您会注意到它将返回一个简单的json,无需身份验证,它是一个公共API,我在Java项目中使用了它。

更新

这是运行API网关测试的输出:

将请求发送到:忽略

UTC 2019年7月22日星期一14:45:20:收到回复。状态:200,集成延迟:6038毫秒

UTC 2019年7月22日星期一14:45:20:端点响应标头:{Date = Mon,2019年7月22日14:45:20 GMT,Content-Type = application / json,Content-Length = 114,Connection = keep -alive,x-amzn-RequestId = 7f9e2441-c4e7-418b-a6ec-e4c667950f91,X-Amz-Function-Error =未处理,x-amzn-Remapped-Content-Length = 0,X-Amz-Executed-Version = $最新,X-Amzn-Trace-Id = root = 1-1d25cbfa-a01e77f34a16ab0779d6a7d7; sampled = 0}

UTC 2019年7月22日星期一14:45:20:转换之前的端点响应正文:{“ errorMessage”:“ 2019-07-22T14:45:20.245Z 7f9c2441-c4e7-419b-a6ec-g4c776950f91任务在6.01之后超时秒”}

UTC 2019年7月22日14:45:20:由于客户功能错误,Lambda执行失败,状态为200:2019-07-22T14:45:20.245Z 7f9c2441-c4e7-419b-a6ec-g4c776950f91 6.01之后任务超时秒。 Lambda请求ID:7f9c2441-c4e7-419b-a6ec-g4c776950f91

2019年7月22日星期一14:45:20 UTC:方法已完成,状态为502

有人可以指出我的错误在哪里吗?

1 个答案:

答案 0 :(得分:0)

我想您正在使用代理集成。您将需要对响应对象的body属性进行字符串化。 See the docs

  

通过Lambda代理集成,Lambda函数必须返回   以下格式的输出:

{
    statusCode: "...",            // a valid HTTP status code
    headers: { 
        custom-header: "..."      // any API-specific custom header
    },
    body: "...",                  // a JSON string.
    isBase64Encoded:  true|false  // for binary support
}