Я хочу отправить запрос 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.info("before request")
var req = https.request(options, (res) => {
console.info('statusCode:', res.statusCode);
console.info('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.info(x.body)
return x.body
}
myAsyncF()
const response = {
statusCode: 200,
body: JSON.stringify({
message: x,
input: event
})
};
cb(null, response);
};
Я использовал асинхронное ожидание, но ничего не возвращается (я должен получить как минимум ошибку, если есть какая-то сетевая ошибка)
вот мой вывод: перед запросом { "Код статуса": 200, "тело": "{\"ввод\":\"\"}" }
чего-то не хватает?
заранее спасибо



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ни в коем случае вы не разрешаете свой Promise, я понятия не имею, что вы считаете «успешным» запросом, но вот пример, который должен направить вас на правильный путь.
return new Promise(function(resolve, reject) {
console.info("before request")
var req = https.request(options, (res) => {
console.info('statusCode:', res.statusCode);
console.info('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();
})
@h.zak это потому, что кажется, что вы возвращаете этот объект только в cb , вам нужно получить результат от http_request и добавить его в тело ответа, если это то, что является намерением.
я добавил в тело, но ничего не изменилось, я обновил код в своем вопросе, потому что я не могу поместить его в комментарий
Проблема решена с помощью пакета request-promise, я действительно не знаю, что именно я пропустил
@h.zak в вашем коде было несколько проблем, например. не разрешая обещание (которое касается моего ответа), но тогда вы не распространяли результат из myAsyncF, и, наконец, вы также не ожидаете результата этой функции. Я думаю, что это, вероятно, немного расплывчато, чтобы предположить, что «использование пакета request-promise» решило проблему.
Удаление process.stdout.write будет не очень хорошей практикой, так как вы запускаете свой код на лямбда, используйте объект контекста или функцию обратного вызова для возврата
process.stdout.write(d) - это операция записи в файл, иногда она также молча терпит неудачу, работая на EC2, ECS ваше решение выглядит жемчужиной. Но на бессерверных серверах всегда лучше избегать функций работы с файлами.
Спасибо за ваш ответ, но все еще не работает, он пропускает функцию https.request, нет журнала для statusCode или заголовков, я получаю только перед запросом { "statusCode": 200, "body": "{\"message\" :\"\",\"Вход\":\"\"}" }