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

时间:2017-06-21 17:50:05

标签: node.js aws-lambda

我正在尝试从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()默默地失败 - 不会抛出错误 - 日志中没有任何内容报告。

2 个答案:

答案 0 :(得分:4)

问题是我从未使用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
&#13;
&#13;
&#13;

答案 1 :(得分:0)

如果你的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);
});
}

请不要尝试添加包需求('https')/ require('http')