Прежде всего, я бы посоветовал вам прекратить использование модуля request
и перейти на нативный. В наши дни все можно сделать без тонны строк. request
- модуль с 48 зависимостями; если вы делаете математику, то это тысячи строк для простого запроса GET.
Вы всегда должны минимизировать сложность своих зависимостей. Я использую Lambda для проверки работоспособности своих сайтов, собирая весь запрос и проверяя HTML на совершенно разных серверах . VPS находится во Франкфурте, AWS в Ирландии. Мой мс / запрос находится в диапазоне от 100 до 150 мс.
Вот простой запрос обещания, который я использую:
function request(obj, timeout) {
return new Promise(function(res, rej) {
if (typeof obj !== "object") {
rej("Argument must be a valid http request options object")
}
obj.timeout = timeout;
obj.rejectUnauthorized = false;
let request = http.get(obj, (response) => {
if (response.statusCode !== 200) {
rej("Connection error");
}
var body = '';
response.on('data', (chunk) => {
body += chunk;
});
response.on('end', () => {
res(body);
});
response.on('error', (error) => {
rej(error);
});
});
request.setTimeout(timeout);
request.on('error', (error) => {
rej(error);
})
request.on('timeout', () => {
request.abort();
rej("Timeout!")
})
});
}
Пример
const reqOpts = {
hostname: 'www.example.com',
port: 443,
path: '/hello',
method: 'GET',
headers: {
handshake: "eXTNxFMxQL4pRrj6JfzQycn3obHL",
remoteIpAddress: event.sourceIp || "lambda"
}
}
try {
httpTestCall = await request(reqOpts, 250);
}
catch (e) {
console.error(e);
}
Теперь, основываясь на этом изменении, переключите ваш обработчик в асинхронный режим, используя exports.handler = async(event, context, callback) => {}
, и используйте консоль для измерения времени выполнения каждого запроса, используя console.time()
и console.timeEnd()
для вашего запроса или чего-либо еще. Оттуда вы можете увидеть, что мешает вашему коду, используя журналы Cloudwatch. Вот еще один пример, основанный на вашем коде:
let reqOpts = {
hostname: 'api.servicem8.com',
port: 443,
path: '/api_1.0/formresponse.json?%24filter=uuid%20eq%20' + strResponseUUID,
method: 'GET',
headers: {
// Use the temporary Access Token that was issued for this event
'Authorization': 'Bearer ' + strAccessToken
}
}
console.time("=========MEASURE_servicem8=========")
let error = null;
await request(reqOpts, 5555).catch((e)=>{
error = e;
})
console.timerEnd("=========MEASURE_servicem8=========")
if (error){
callback(null, {err: "Unable to query form response records, received HTTP" + error}); /* or anything similar */
}
Ссылки
https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html
https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html