#node.js #amazon-web-services #aws-lambda #aws-api-gateway
#node.js #amazon-веб-сервисы #aws-lambda #aws-api-gateway
Вопрос:
Я использую API Gateway и AWS Lambda для обмена с другой функцией AWS Lambda.
Я должен отправить ответ после первоначального запроса на вставку данных, будь то успешный или неудачный. Я использую определенный маршрут с API Gateway.
Вот структура :
Теперь я продолжаю получать 502 искаженных ответа лямбда-прокси, и это есть в моих журналах тестирования API :
Tue Sep 22 06:56:10 UTC 2020 : Endpoint response headers: {Date=Tue, 22 Sep 2020 06:56:10 GMT, Content-Type=application/json, Content-Length=4, Connection=keep-alive, x-amzn-RequestId=xxxxxxxx, x-amzn-Remapped-Content-Length=0, X-Amz-Executed-Version=$LATEST, X-Amzn-Trace-Id=xxxxxxx}
Tue Sep 22 06:56:10 UTC 2020 : Endpoint response body before transformations: null
Tue Sep 22 06:56:10 UTC 2020 : Execution failed due to configuration error: Malformed Lambda proxy response
Tue Sep 22 06:56:10 UTC 2020 : Method completed with status: 502
Проблема в том, что я возвращаю реальный ответ. Как я уже говорил ранее, я использую API Gateway с пакетом lambda-api, который обрабатывает маршрутизацию API Gateway, например Express, и это то, что я делаю :
api.post('/database-manager/create-request', async (lambdaRequest, lambdaResponse, callback) => {
await provideConnectionInfo()
let connection = mysql.createConnection({
host: mySQLHost,
user: mySQLUser,
password: mySQLPassword,
database: mySQLDatabase
}
)
requestNb = lambdaRequest.headers["request-id"]
pipelineId = lambdaRequest.headers["pipeline-id"]
connection.connect(function (err) {
if (err) throw err
let query = "INSERT INTO ec2_request(request_id, pipeline_id) VALUES (?,?)"
connection.query(query,[requestNb,pipelineId], function (err, result) {
if (err) {
connection.end()
console.log("insertion did not work : " err)
let response = {
"statusCode": 404,
"headers": {},
"isBase64Encoded": false,
"body": JSON.stringify({message: "Record not inserted"})
}
return response
)
} else {
connection.end()
console.log("1 record inserted")
let response = {
"statusCode": 200,
"headers": {},
"isBase64Encoded": false,
"body": JSON.stringify({message: "tired of this bs"})
}
return response
}
}
)
}
)
})
И хуже всего то, что мои журналы не показывают ничего неправильного :
1600758637213 START RequestId: f804577b-c0a2-4d11-8822-52363fa41c7d Version: $LATEST
1600758639189 2020-09-22T07:10:39.188Z f804577b-c0a2-4d11-8822-52363fa41c7d INFO 1 record inserted
1600758639348 END RequestId: f804577b-c0a2-4d11-8822-52363fa41c7d
1600758639348 REPORT RequestId: f804577b-c0a2-4d11-8822-52363fa41c7d Duration: 2134.45 ms Billed Duration: 2200 ms Memory Size: 128 MB Max Memory Used: 94 MB Init Duration: 555.23 ms
Если кто-нибудь увидит, где я мог ошибиться, я куплю им пончик.
Интересно, что это неправильный статус…
Заранее большое спасибо,
Тарифы
Ответ №1:
Вы используете функцию обратного вызова внутри async
без ожидания.
Вот несколько вариантов
-
Удалить
async
изapi.post('/database-manager/create-request', async (lambdaRequest, lambdaResponse, callback) => {
. -
Сохраняйте асинхронность и переносите
query function
какPromise
и используйтеawait
api.post('/database-manager/create-request', async (lambdaRequest, lambdaResponse, callback) => { await provideConnectionInfo() let connection = mysql.createConnection({ host: mySQLHost, user: mySQLUser, password: mySQLPassword, database: mySQLDatabase } ) requestNb = lambdaRequest.headers["request-id"] pipelineId = lambdaRequest.headers["pipeline-id"] const res = await new Promise(function(resolve, reject) { connection.connect(); let query = "INSERT INTO ec2_request(request_id, pipeline_id) VALUES (?,?)" connection.query(query,[requestNb,pipelineId], function (err, result) { if (err) { connection.end() console.log("insertion did not work : " err) let response = { "statusCode": 404, "headers": {}, "isBase64Encoded": false, "body": JSON.stringify({message: "Record not inserted"}) } reject(response) } else { connection.end() console.log("1 record inserted") let response = { "statusCode": 200, "headers": {}, "isBase64Encoded": false, "body": JSON.stringify({message: "tired of this bs"}) } resolve(response) } }) }); return res; })
Примечание: Код не был протестирован.