Javascript 无服务器节点跳过https请求
我想发送一个https请求并使用无服务器框架处理结果,但它似乎不起作用 Nodejs(无服务器)跳过我的请求并直接跳转到最后一个结果,而无需等待https响应 以下是我的职能:Javascript 无服务器节点跳过https请求,javascript,node.js,typescript,aws-lambda,serverless,Javascript,Node.js,Typescript,Aws Lambda,Serverless,我想发送一个https请求并使用无服务器框架处理结果,但它似乎不起作用 Nodejs(无服务器)跳过我的请求并直接跳转到最后一个结果,而无需等待https响应 以下是我的职能: import { APIGatewayEvent, Callback, Context, Handler } from "aws-lambda"; var AWS = require("aws-sdk"); const querystring = require('querystring'); const 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,
“正文”:“{\”输入\“:\“\”}”
}
有什么东西不见了吗
提前感谢您您在任何情况下都不会解决您的承诺,我不知道您认为什么是“成功”的请求,但这里有一个例子可以让您走上正确的道路
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();
})
删除process.stdout.write将不是一个很好的实践,因为在lambda上运行代码时,请使用上下文对象或回调函数返回
process.stdout.write(d)是对文件的写入操作,有时它也会无声地失败,运行在EC2上,您的解决方案看起来很好。但在无服务器上,最好避免使用文件操作函数谢谢您的回复,但仍然不起作用,它跳过了https.request函数,没有状态码或标题的日志,我只在请求前收到{“statusCode”:200,“body”:“{“message\”:\”,“input\”:\“}”@h、 zak这是因为在你看来,你只是在
cb
中返回了那个对象,你需要从http\u请求
中获得结果,并将其添加到响应的主体中,如果这是你的意图的话。我添加到主体中,但没有任何改变,我更新了问题中的代码,因为我无法将其放在注释中。问题是使用请求承诺包解决的,我真的不知道我错过了什么exactly@h.zak您的代码中存在多个问题,例如未解决承诺(我的答案所述)但是您没有从myAsyncF
传播结果,最后也没有等待该函数的结果。我认为建议“使用请求-承诺包”解决问题可能有点模糊。