我正在尝试编写一个简单的AWS lambda函数,以从外部公共API中检索数据。我在互联网上复制并粘贴了代码,没有任何运气。
我已经删除了代码,以使其简单地保持简单。公共API是:https://swapi.co/api/people/1/
如何从公共API中获取数据?
const https = require('https');
exports.handler = async (event) => {
var options = {
method: 'GET',
host: 'https://swapi.co/api/people/1/',
};
console.log('options', options);
const req = https.request(options, (res) => {
console.log('statusCode: ${res.statusCode}')
console.log(JSON.stringify(res))
});
// TODO implement
const response = {
statusCode: 200,
body: JSON.stringify('Hello from Lambda!'),
};
return response;
};
AWS编辑器中的日志文件显示:
START RequestId: 3ba3f23a-11c2-40af-b9e7-0258a6531728 Version: $LATEST
2019-05-27T16:17:44.839Z 3ba3f23a-11c2-40af-b9e7-0258a6531728 INFO options { method: 'GET', host: 'https://swapi.co/api/people/1/' }
END RequestId: 3ba3f23a-11c2-40af-b9e7-0258a6531728
REPORT RequestId: 3ba3f23a-11c2-40af-b9e7-0258a6531728 Duration: 305.90 ms Billed Duration: 400 ms Memory Size: 128 MB Max Memory Used: 26 MB
您的代码有一些问题:
callback
函数传递到处理程序中触发执行的末端,或者如果您自己不调用代码,则在代码退出时被要求。我不确定这是如何与异步JavaScript代码相互作用的,但是它可能导致您的代码早期退出,以至于您没有在任何地方打电话。
您使用的是async
方法,这是一个很好的做法,但是您的休息电话不是使用它,而是一种回调方法。正如我在下面显示的那样,这可以转换为异步调用,这使代码更容易理解。
我认为最大的问题是您的options
是错误的。您在主机开始时不需要https
(因为它已经知道该方案(,并且路径不能在主机中。我最初没有发现这个。
这对我有用,尽管您无法在整个响应中调用JSON.stringify
,因为它是一个复杂的对象,而不仅仅是模型。
const https = require('https');
exports.handler = async (event, context, callback) => {
var options = {
method: 'GET',
host: 'swapi.co',
path: '/api/people/1/',
};
await new Promise((resolve, reject) => {
let request = https.request(options, response => {
try {
// do whatever
} finally {
resolve();
}
});
request.on('error', (e) => reject(e));
request.end();
});
callback();
};
以下代码正在工作
const http = require("https");
exports.handler = async(event, context, callback) => {
var options = {
"method": "GET",
"hostname": "app.casejacket.com",
"port": null,
"path": "/api/",
"headers": {
"cache-control": "no-cache",
"Content-Type": "application/json"
}
};
await new Promise((resolve, reject) => {
console.log('Promise.. ');
var req = http.request(options, function (res) {
var chunks = [];
res.on("data", function (chunk) {
chunks.push(chunk);
});
res.on("end", function () {
var body = Buffer.concat(chunks);
let result = JSON.parse(body.toString());
console.log(body.toString());
resolve(body.toString());
callback(null, result)
});
});
req.end();
});
callback();
};