【发布时间】:2016-10-16 04:37:45
【问题描述】:
我创建了 4 个 Lambda 函数来处理将写入 MySQL 表的信息。前三个函数只是分别选择、插入和更新 MYSQL 表记录。
然后我创建了第 4 个函数来接受记录详细信息作为事件参数的一部分。此函数将首先尝试通过调用第一个 lambda 函数来选择记录,如果找到它,将使用 update lambda 函数更新表上的记录。如果没有找到,它将调用插入函数来添加记录。我在操作 MySQL 表的 3 个函数上使用 pool.query。我还使用 lambda.invoke 从第四个函数调用这三个函数。
通过将记录详细信息作为参数传递,我能够在本地成功测试第 4 个函数,并且它能够成功调用三个 Lambda 函数并更新 mySQL 表记录。我遇到的问题是,当我在 AWS Lambda 中上传函数时,它不会调用这三个函数中的任何一个。我在日志中没有看到任何错误,所以我不知道如何检查问题出在哪里。这是调用其他函数的代码:
exports.handler = (event, context, callback) => {
var err = null;
var payload = {
qryString : event.qryString,
record: event.updaterecord,
dbConfigPool : event.dbConfigPool
}
var params = {
FunctionName: 'getInventory',
Payload: JSON.stringify(payload)
}
console.log(' before invoke ' + JSON.stringify(params) )
lambda.invoke(params, function(err, data) {
console.log(' aftr invoke ' + JSON.stringify(params) )
if (err) {
console.log('err ' + err, err.stack); // an error occurred
event.message = err + ' query error';
}
else {
console.log('success' + JSON.stringify(data));
console.log(' status code ' + JSON.stringify(data.StatusCode));
console.log(' Payload ' + JSON.stringify(JSON.parse(data.Payload)));
var rowsTemp = JSON.parse(data.Payload);
var rows = rowsTemp.data;
if (!rowsTemp.recordExist) {
console.log('insert')
// Update inventory record only if quantity is not negative
var newQuantity = 0
newQuantity = parseFloat(event.updaterecord.quantity);
if (Math.sign(newQuantity) === 1) {
var payload = {
record: event.updaterecord,
dbConfigPool : event.dbConfigPool
}
console.log('insert' + JSON.stringify(payload));
var params = {
FunctionName: 'insertInventory',
Payload: JSON.stringify(payload)
}
lambda.invoke(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
}
}
else {
newQuantity = 0
newQuantity = parseFloat(event.updaterecord.quantity) + parseFloat(rows[0].quantity);
if (Math.sign(newQuantity) === 1) {
event.updaterecord.quantity = newQuantity;
} else {
// Set to zero if the result is negative
event.updaterecord.quantity = 0;
}
console.log('value ' + JSON.stringify(newQuantity) + ' updaterecord' + JSON.stringify(event.updaterecord.quantity) );
var payload = {
qryString : event.qryString,
record: event.updaterecord,
dbConfigPool : event.dbConfigPool
}
console.log('update' + JSON.stringify(payload));
var params = {
FunctionName: 'updateInventory',
Payload: JSON.stringify(payload)
}
console.log(' before invoke ' + JSON.stringify(params) )
lambda.invoke(params, function(err, data) {
console.log(' after invoke ' + JSON.stringify(params) )
if (err) {
console.log('err ' + err, err.stack); // an error occurred
event.message = err + ' query error';
} else {
console.log(data);
} // else
}); // lambda invoke
}
} // successful response
});
console.log(' end of function');
var completed = true;
context.callbackWaitsForEmptyEventLoop = false;
callback(null, completed);
}
如果代码很长,请见谅。但我想表明我确实放了一些 console.logs 来监控它的经过。 cloudwatch 日志仅显示第一个 lambda.invoke 之前的第一条消息,然后显示函数结束的最后一条消息。
我也没有在 cloudwatch 中看到已调用的三个函数的任何日志条目。
06/17 好的,由于我仍然无法完成这项工作,我将代码简化为以下内容:
exports.handler = (event, context, callback) => {
var err = null;
var updatedRecord = false;
var responseDetail = {};
var payload = {
qryString : event.qryString,
record: event.updaterecord,
dbConfigPool : event.dbConfigPool
}
var params = {
FunctionName: 'getInventory',
Payload: JSON.stringify(payload)
}
console.log(' before invoke ' + JSON.stringify(params));
lambda.invoke(params, function(err, data) {
if (err) {
event.message = err + ' query error';
callback(err,event.message);
}
else {
console.log('success' + JSON.stringify(data));
console.log(' status code ' + JSON.stringify(data.StatusCode));
console.log(' Payload ' + JSON.stringify(JSON.parse(data.Payload)));
callback(null, data);
} // successful response
});
console.log(' end of function');
// var completed = true;
// context.callbackWaitsForEmptyEventLoop = false;
// callback(null, completed);
}
但是,当我进行测试时,该功能超时。我还为附加到函数的角色提供了完整的 Lambda 和 RDS 访问权限。
【问题讨论】:
标签: mysql node.js amazon-web-services aws-lambda