AWS Lambda(NodeJS)是否不允许http.request或https.request?

wd2eg0qa  于 2023-03-22  发布在  Node.js
关注(0)|答案(3)|浏览(133)

我试图从Lambda向另一个API发出请求。我发现使用NodeJS http和https模块允许GET请求,但任何其他(例如POST)都不起作用;POST碰巧是我需要为我试图调用的服务工作的唯一方法。
下面是Lambda执行GET并接收200响应的工作示例:

const https = require('https')

function handler(event, context, callback) {
    const options = {
        hostname: 'encrypted.google.com'
    }
    
    https
        .get(options, (res) => {
            console.log('statusCode:', res.statusCode);
        
            res.on('end', callback.bind(null, null))
        })
        .on('error', callback);
}

exports.handler = handler

这就证明了这个请求是被允许的。但是,如果脚本试图使用https(或https)lib/模块的.request()方法发出相同的请求,那么请求永远不会完成,并且Lambda超时。

const https = require('https')

function handler(event, context, callback) {
    const options = {
        hostname: 'encrypted.google.com',
        method: 'GET'
    }
    
    https
        .request(options, (res) => {
            console.log('statusCode:', res.statusCode);
        
            res.on('end', callback.bind(null, null))
        })
        .on('error', callback);
}

exports.handler = handler

我不知道我做错了什么。调用https.request()默默地失败了-没有抛出错误-日志中没有任何报告。

bvuwiixz

bvuwiixz1#

问题是我从来没有用req.end()完成请求。

const https = require('https')

function handler(event, context, callback) {
    const options = {
        hostname: 'encrypted.google.com',
        method: 'GET'
    }
    
    https
      .request(options, (res) => {
          console.log('statusCode:', res.statusCode);

          res.on('end', callback.bind(null, null))
      })
      .on('error', callback)
      .end(); // <--- The important missing piece!
}

exports.handler = handler
lqfhib0f

lqfhib0f2#

如果您的API是HTTPS,请尝试此选项。

var url = 'HTTPS URL HERE';

var req = https.get(url, (res) => {
    var body = "";

    res.on("data", (chunk) => {
        body += chunk
    });

    res.on("end", () => {
        var result = JSON.parse(body);

        callBack(result)
    });
}).on("error", (error) => {
    callBack(err);
});
}

如果是HTTP,

var url = 'HTTP URL HERE';

var req = http.get(url, (res) => {
    var body = "";

    res.on("data", (chunk) => {
        body += chunk
    });

    res.on("end", () => {
        var result = JSON.parse(body);

        callBack(result)
    });
}).on("error", (error) => {
    callBack(err);
});
}

请不要忘记添加包require('https')/ require('http')

ahy6op9u

ahy6op9u3#

POST方法由request方法完成。
下面是Lambda代码:

const https = require('https');
    
const options = {
  hostname: 'Your host name',
  path: '/api/v1/Login/Login',
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body : JSON.stringify({
        'email': 'hassan.uzair9@gmail.com',
        'password': 'Asdf1234.',
  })
};

var result;
try{
    result = await https.request(options);
    console.log("result.....",result);
}catch(err){
    console.log("err......",err);
}

相关问题