我想发送一个https请求并使用无服务器框架处理结果,但它似乎不起作用。
Nodejs(无服务器(跳过我的请求并直接跳转到最后一个结果,而无需等待https响应
这是我的函数:
import { APIGatewayEvent, Callback, Context, Handler } from "aws-lambda";
var AWS = require("aws-sdk");
const querystring = require('querystring');
const https = require('https');
const TOKEN: String = "token";
export const hello: Handler = (
event: APIGatewayEvent,
context: Context,
cb: Callback
) => {
function https_request() {
var postData = querystring.stringify({
query: "query"
});
var options = {
hostname: 'example.com',
port: 443,
path: '/path',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': TOKEN
}
};
return new Promise(function(resolve, reject) {
console.log("before request")
var req = https.request(options, (res) => {
console.log('statusCode:', res.statusCode);
console.log('headers:', res.headers);
if (res.statusCode !== 200) {
// REJECT IF THE RESPONSE WASN'T AS EXPECTED
return reject(new Error('Request failed'));
}
res.on('data', (d) => {
process.stdout.write(d);
resolve(d); // RESOLVE ON SUCCESS WITH EXPECTED DATA
});
});
req.on('error', (e) => {
console.error(e);
reject(e); // REJECT ON REQUEST ERROR
});
// req.write(postData);
req.end();
})
}
let x:any;
async function myAsyncF() {
x= await https_request();
console.log(x.body)
return x.body
}
myAsyncF()
const response = {
statusCode: 200,
body: JSON.stringify({
message: x,
input: event
})
};
cb(null, response);
};
我使用了异步等待,但没有任何返回(如果有一些网络错误之王,我应该至少会收到一个错误(
这是我的输出:请求前{ "状态代码": 200, "body": "{\"input\":\"\"}"}
有什么遗漏吗?
提前谢谢你
在任何时候你都不会解决你的Promise
,我不知道你认为什么是"成功"的请求,但这里有一个例子应该让你走上正确的轨道
return new Promise(function(resolve, reject) {
console.log("before request")
var req = https.request(options, (res) => {
console.log('statusCode:', res.statusCode);
console.log('headers:', res.headers);
if (res.statusCode !== 200) {
// REJECT IF THE RESPONSE WASN'T AS EXPECTED
return reject(new Error('Request failed'));
}
res.on('data', (d) => {
process.stdout.write(d);
resolve(d); // RESOLVE ON SUCCESS WITH EXPECTED DATA
});
});
req.on('error', (e) => {
console.error(e);
reject(e); // REJECT ON REQUEST ERROR
});
req.write(postData);
req.end();
})
remove process.stdout.write 将不是一个很好的做法,因为您在 lambda 上运行代码,使用上下文对象或回调函数返回
process.stdout.write(d( 是对文件的写入操作,有时它也静默失败,在 EC2、ECS 上运行,您的解决方案看起来很宝石。但是在无服务器上,最好避免使用文件操作函数