我正在尝试编写一个简单的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
答案 0 :(得分:0)
您的代码存在一些问题:
传递到处理程序中的callback
函数触发执行的结束,或者如果您自己不调用代码,则在代码退出时为您调用。我不完全确定它如何与异步javascript代码进行交互,但可能是因为您未在任何地方调用它而导致代码提前退出。
您正在使用async
方法,这是一个好习惯,但是您的rest调用不是在使用它,而是在使用回调方法。可以将其转换为异步调用,如下所示,这使代码更易于理解。
不过,我认为最大的问题是您的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();
};
答案 1 :(得分:0)
下面的代码有效
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();
};