[英]Async/Await with Lamba and Database Calls
通過 async/await 文檔后,我仍然無法找出代碼中的錯誤。 我正在嘗試在調用 lambda 時執行以下操作。
所有這些都需要同步完成。
下面是我的邏輯剪下的代碼
var AWS = require('aws-sdk');
var lambda = new AWS.Lambda({ region: 'ap-south-1' });
var mysql = require('/opt/node_modules/mysql');
var config = require('/opt/config.json');
var con = mysql.createConnection({
host: config.dbhost,
user: config.dbuser,
password: config.dbpassword,
database: config.dbname,
});
exports.handler = async function(event, context, callback) {
context.callbackWaitsForEmptyEventLoop = false;
let response = null;
let errors = [];
try {
let body = JSON.parse(event.body);
const email = body.email;
const password = body.password;
let loggerObject = {
email: email,
feature: 'LOGIN',
request: JSON.stringify(body)
};
let loggerResponseCallback = await logRequest(loggerObject);
console.log(loggerResponseCallback);
const userValidationSQL = `SELECT QUERY`;
await con.query(userValidationSQL, [email, password], async(userValidationError, userValidationResponse) => {
if (userValidationError) {
throw userValidationError;
}
console.log(" User Validation Response", userValidationResponse);
loggerObject = {
email: email,
feature: 'LOGIN',
response: JSON.stringify(userValidationResponse)
}
loggerResponseCallback = await logRequest(loggerObject);
console.log(loggerResponseCallback);
callback(null, {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({ status: 'success', data: userValidationResponse }),
}) //callback
})
}
catch (error) {
console.log(" catch========== ", error)
callback(null, {
statusCode: 400,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({ status: 'error', message: 'Bad Request', error: errors }),
})
}
};
async function logRequest(loggerObject) {
console.log("Invoking Logger Function");
let params = {
FunctionName: 'common-logger',
InvocationType: 'RequestResponse',
LogType: 'Tail',
Payload: JSON.stringify(loggerObject)
};
await lambda.invoke(params, function(loggerError, loggerResponse) {
if (loggerError) {
console.log("Error in invoking Logger Function ", loggerError)
}
console.log('Logger Response:', loggerResponse);
return loggerResponse;
});
}
我嘗試的所有 async/await 組合似乎都不起作用。 有人可以指導嗎?
更新二:
使用下面的代碼,我確實設法讓它們按順序執行,但是我無法從第二個 lambda 函數中獲取值
var AWS = require('aws-sdk');
var mysql = require('/opt/node_modules/mysql');
var con = mysql.createConnection({
host: config.dbhost,
user: config.dbuser,
password: config.dbpassword,
database: config.dbname,
});
exports.handler = function(event, context, callback) {
context.callbackWaitsForEmptyEventLoop = false;
let response = null;
let errors = [];
try {
let body = JSON.parse(event.body);
const email = body.email;
const password = body.password;
let loggerObject = {
email: email,
feature: 'LOGIN',
};
let loggerResponseCallback = logRequest(loggerObject);
console.log('First loggerResponseCallback:', loggerResponseCallback);
const userValidationSQL = `SELECT Query`;
con.query(userValidationSQL, [email, password], (userValidationError, userValidationResponse) => {
if (userValidationError) {
throw userValidationError;
}
console.log(" User Validation Response", userValidationResponse);
loggerObject = {
email: email,
feature: 'LOGIN',
method: 'POST',
};
loggerResponseCallback = logRequest(loggerObject);
console.log('Second loggerResponseCallback:', loggerResponseCallback);
callback(null, {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({ status: 'success', data: userValidationResponse }),
}) //callback
})
}
catch (error) {
console.log(" catch========== ", error)
callback(null, {
statusCode: 400,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({ status: 'error', message: 'Bad Request', error: errors }),
})
}
};
async function logRequest(loggerObject) {
var lambda = new AWS.Lambda({ region: 'ap-south-1' });
console.log("Invoking Logger Function");
let params = {
FunctionName: 'common-logger',
InvocationType: 'RequestResponse',
LogType: 'Tail',
Payload: JSON.stringify(loggerObject)
};
await lambda.invoke(params, function(loggerError, loggerResponse) {
if (loggerError) {
console.log("Error in invoking Logger Function ", loggerError)
}
console.log('Logger Response:', loggerResponse);
return loggerResponse;
});
}
我的 Common-Logger Lambda 函數
var mysql = require('/opt/node_modules/mysql');
var config = require('/opt/config.json');
var con = mysql.createConnection({
host: config.dbhost,
user: config.dbuser,
password: config.dbpassword,
database: config.dbname,
});
exports.handler = (event, context, callback) => {
context.callbackWaitsForEmptyEventLoop = false;
console.log('invoked logger');
let loggerId = -1;
try {
let email = null,
const sql = 'INSERT QUERY';
con.query(sql, [ email], (err, res) => {
if (err) {
console.log(err)
throw err;
}
loggerId = res.insertId
console.log('Logger Response:', loggerId);
if (!correlationID) {
const sql = 'UPDATE LOGGER SET correlationId = ? WHERE ID = ?';
con.query(sql, [loggerId, loggerId], (err, res) => {
if (err) {
console.log(err)
throw err;
}
console.log("Updated CorrelationId for Record:" + loggerId);
}); //con.query
}
callback(null, {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({
status: 'success',
data: { "correlationId": loggerId }
})
})
}); //con.query
}
catch (error) {
console.log("catch", error);
}
};
我為你重構了,你可以試試:
var AWS = require("aws-sdk");
var lambda = new AWS.Lambda({ region: "ap-south-1" });
var mysql = require("/opt/node_modules/mysql");
var config = require("/opt/config.json");
var con = mysql.createConnection({
host: config.dbhost,
user: config.dbuser,
password: config.dbpassword,
database: config.dbname,
});
exports.handler = async function (event, context, callback) {
context.callbackWaitsForEmptyEventLoop = false;
let response = null;
let errors = [];
try {
let body = JSON.parse(event.body);
const email = body.email;
const password = body.password;
let loggerObject = {
email: email,
feature: "LOGIN",
request: JSON.stringify(body),
};
let loggerResponseCallback = await logRequest(loggerObject);
console.log(loggerResponseCallback);
const userValidationSQL = `SELECT QUERY`;
con.query(
userValidationSQL,
[email, password],
async (userValidationError, userValidationResponse) => {
if (userValidationError) {
throw userValidationError;
}
console.log(" User Validation Response", userValidationResponse);
loggerObject = {
email: email,
feature: "LOGIN",
response: JSON.stringify(userValidationResponse),
};
loggerResponseCallback = await logRequest(loggerObject);
console.log(loggerResponseCallback);
callback(null, {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*",
},
body: JSON.stringify({
status: "success",
data: userValidationResponse,
}),
}); //callback
}
);
} catch (error) {
console.log(" catch========== ", error);
callback(null, {
statusCode: 400,
headers: {
"Access-Control-Allow-Origin": "*",
},
body: JSON.stringify({
status: "error",
message: "Bad Request",
error: errors,
}),
});
}
};
async function logRequest(loggerObject) {
console.log("Invoking Logger Function");
let params = {
FunctionName: "common-logger",
InvocationType: "RequestResponse",
LogType: "Tail",
Payload: JSON.stringify(loggerObject),
};
try {
const loggerResponse = await lambda.invoke(params).promise();
console.log("Logger Response:", loggerResponse.Payload);
return loggerResponse.Payload;
} catch (loggerError) {
console.log("Error in invoking Logger Function ", loggerError);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.