我正在将AWS SES邮件与nodemailer一起使用。发送电子邮件后,为该电子邮件创建的消息ID将存储在我的数据库中。收件人收到电子邮件后,在SNS的帮助下,我会收到通知电子邮件,并触发lambda。我正在使用此lambda来获取电子邮件的更新状态,并在数据库中对其进行更新。我通过在AWS上载包zip文件夹创建了lambda函数。
当我发送一封电子邮件时,将发送电子邮件,并且lambda能够更新数据库。但是,如果我一次发送10封电子邮件,则所有电子邮件都已发送,但是lambda仅更新5-8条记录。
Mysql:2.18.1节点:12.x
Lambda的PFB代码,
const config = require("./config.json");
const getConnectionPool = ( dbname ) => {
const params = {
host: config.dbhost,
user: config.dbuser,
password: config.dbpassword,
database: dbname,
multipleStatements: true,
// debug:true
}
const pool = mysql.createPool( params );
return pool;
}
const getParameters = ( event ) => {
const data =event.Records[0];
let eventType = 0;
const record = JSON.parse(data.Sns.Message);
const mail = record.mail;
const headers = mail.headers[3];
let dbname = headers.value;
dbname = dbname.replace("<", "");
dbname = dbname.replace(">", "");
if( record.eventType == "Delivery" ) {
eventType = 2;
} else if( record.eventType == "Bounce" ) {
eventType = 3;
}else if( record.eventType == "Complaint" ) {
eventType = 4;
}else if( record.eventType == "Reject" ) {
eventType = 5;
}
return {
eventType: eventType,
messageId: mail.messageId,
dbname: dbname
}
}
exports.handler = (event, context, callback) => {
let params = getParameters( event );
//prevent timeout from waiting event loop
context.callbackWaitsForEmptyEventLoop = false;
const pool = getConnectionPool( params.dbname );
pool.getConnection( (err, connection) => {
// Use the connection
connection.query(
"START TRANSACTION;SET SQL_SAFE_UPDATES = 0;update email_logs set bool_is_sent = " + mysql.escape( params.eventType ) + " where message_id= " + mysql.escape( params.messageId ) + ";SET SQL_SAFE_UPDATES = 1;COMMIT;",
(error, results ) => {
// And done with the connection.
connection.release();
// Handle error after the release.
if (error) callback(error);
else callback(null, results[0]);
}
);
});
};
只是cloudwatch日志的一小段
OkPacket {
fieldCount: 0,
affectedRows: 0,
insertId: 0,
serverStatus: 43,
warningCount: 0,
message: '(Rows matched: 0 Changed: 0 Warnings: 0',
protocol41: true,
changedRows: 0
},
这里怎么了。
如果SNS同时收到针对不同电子邮件的多个更新,则您的lambda函数可能会在单个事件中接收捆绑的记录(例如,您的lambda可能会被触发10次更新3次)。
您仅访问第一条记录(event.Records[0]
),但可能有多个。