mysql - AWS Lambda 在代码中间停止执行

标签 mysql node.js amazon-web-services amazon-s3 aws-lambda

我正在尝试在 s3 中触发 csv 文件上传,并使用 lambda 将文件中的数据插入到数据库中。

大多数情况下,如果我在几秒钟的间隙内连续运行代码,代码就会成功执行。

但有时我面临的问题是代码在控制台 console.log('about to get the data'); 处停止执行,并忽略其余代码,有时 mysql 连接超时

我发现只有当我测试 lambda 代码的间隔超过 20 秒时才会出现问题。所以,我猜这是一个冷启动问题。

我不想错过任何一个 s3 触发器。因此,我需要帮助来查找代码中导致此问题的缺陷。

   const AWS = require('aws-sdk');
    const s3 = new AWS.S3({region: 'ap-south-1', apiVersion: '2006-03-01'});
    var mysql= require('mysql');

    var conn = mysql.createPool({
        connectionLimit: 50,
        host: 'HOST',
        user: 'USER',
        password: 'PASSWORD',
        database: 'DATABASE'
      })

    async function mainfunc (event, context, callback) {
        console.log("Incoming Event: ", JSON.stringify(event));
        const bucket = event.Records[0].s3.bucket.name;
        const filename = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));

        const params = {
            Bucket: bucket,  
            Key:  filename
        };


        console.log('about to get the data'); //Code stops here some times

          return await getresult(params);


    };

    async function getresult(params){
        var result =  await s3.getObject(params).promise();


        var recordList = result.Body.toString('utf8').split(/\r?\n/).filter(element=>{
            return element.length> 5;
          })
          recordList.shift()
          var jsonValues = [];
          var jsonKeys = result.Body.toString('utf8').split(/\r?\n/)[0]

          recordList.forEach((element) => {
            element = element.replace(/"{2,}/g,'"').replace(/, /g,"--").replace(/"{/, "{").replace(/}"/, "}").replace(/,/g, ';').replace(/--/g,', ').split(';');
            jsonValues.push(element)
          });

          var lresult = await query(jsonKeys, jsonValues);        
          return lresult;

    }

    async function query(jsonKeys, jsonValues){
      var qresult = await conn.getConnection(function(err, connection) {
        if (err){
          console.log(err,'------------------------------------');// Sometimes i get Sql Connection timeout error here
        } else {
        console.log("Connected!");
        var sql = "INSERT INTO reports ("+jsonKeys+") VALUES ?";
        connection.query(sql, [jsonValues], function (err, result) {
          if (err){
            console.log(err);
            connection.release()
            return err;
          } else {
          console.log("1 record inserted");
          console.log(result);
          connection.release()
          return result;
          }
        });
      }
      })

    }



      exports.handler = mainfunc

最佳答案

我已经通过在“查询”函数中使用promise解决了这个问题

function query(jsonKeys, jsonValues){
      return new Promise(function(resolve, reject) {
      conn.getConnection(function (err, connection) {
        if (err) {
          console.log(err, '------------------------------------');
        }
        else {
          console.log("Connected!");
          var sql = "INSERT INTO principal_reports (" + jsonKeys + ") VALUES ?";
          connection.query(sql, [jsonValues], function (err, result) {
            if (err) {
              console.log(err);
              connection.release();
              reject(err)
            }
            else {
              console.log("1 record inserted");
              console.log(result);
              connection.release();
              resolve(result)
            }
          });
        }
      })
    })
    }

并更改了代码

var lresult = await query(jsonKeys, jsonValues);

var lresult = await query(jsonKeys, jsonValues).then(data =>{
            return data;
          }).catch(error =>{
            return error;
          });

关于mysql - AWS Lambda 在代码中间停止执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59526377/

相关文章:

mysql - 如何使用 Node Mysql Api 在 bot 框架 v4 中存储用户对话

javascript - 对同一路径使用 app.post() 和 app.put()

node.js - 箭头函数的 Istanbul 尔函数覆盖率?

amazon-web-services - ElasticSearch-如何切换别名以使用新数据重建数据索引?

database - 对于由多个不同服务共享的简单数据库(本质上只是一个键/值存储)来说,最好的 AWS 服务是什么?

mysql - 当我尝试在 Windows 中打开 MAMP 时,它会抛出错误 "install .Net core"

mysql - rails 大量数据在单次插入 activerecord 中发出

MySQL按月汇总并运行总计

node.js - lambda 触发器回调 vs context.done

amazon-web-services - AWS::事件::规则失败调用调试信息?