AWS Lambda无法更新所有记录

问题描述 投票:0回答:1

我正在将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
  },

这里怎么了。

mysql node.js aws-lambda nodemailer amazon-ses
1个回答
0
投票

如果SNS同时收到针对不同电子邮件的多个更新,则您的lambda函数可能会在单个事件中接收捆绑的记录(例如,您的lambda可能会被触发10次更新3次)。

您仅访问第一条记录(event.Records[0]),但可能有多个。

© www.soinside.com 2019 - 2024. All rights reserved.