首页 > 解决方案 > 节点 js Lamba 不等待 db 事件完成

问题描述

我有一个 lambda 函数,它连接到 MySQL 并将数据流式传输到 aws sqs,此代码在本地运行良好,但是当在 lambda 中运行时,函数在将事件发布到 sqs 之前终止,lambda 不等待事件循环完成。

以下是代码。

exports.handler = async (event,context) => {
  return new Promise((resolve,reject)=>{
    context.callbackWaitsForEmptyEventLoop = true;
    console.log("running handler");
    query().then((message)=>{
      console.log("sucess++++ " + message);
      resolve(message);
    },(error)=>{
      console.log("Error++ " + error);
      reject(error);
    });
  })

};

function query() {
  logger.info("inside query()");
  return new Promise((resolve,reject)=>{
    try {
      connection =  mysql.createConnection({
        host: HOST,
        user: USER,
        password: PASSWORD,
        port: PORT
      });
      const dateObject =  getDateObject();
      console.log('dateobject ' + dateObject);
      let sql =  fs.readFileSync('./sql/test.sql').toString();
      const finalSql =  sql.replace(/{dateString}/g, dateObject);
      // logger.info("running query " + finalSql);
       console.log(finalSql);
      var query =  connection.query(finalSql);
     query
        .on('error', async function (err) {
          logger.error("error while running query " + err);
          reject(err);

        })
        .on('fields', function (fields) {
        })
        .on('result', async function (row) {
          // connection.pause();
          await processRow(row);
        })
        .on('end', async function () {
          logger.info("all rows have been received");
          //logger.info("closing connections");
          resolve("sucesss");
          connection.end();
        });
    }
    catch (error) {
      console.log(error);
      logger.error(error);
    }
  })


}

// };

 async function processRow(row) {
  await sendMessage(row);
}

 function getDateObject() {

  //return dateObj;
}

async sendMessage(message) {
    let messageBody = {};
    messageBody['Subject']="xyz";
    messageBody['Message']= JSON.stringify(message);
    var params = {
      DelaySeconds: 0,
      QueueUrl: SQS_URL,
      MessageBody: JSON.stringify(messageBody)
    }
    this.sqs.sendMessage(params, function (err, data) {
      if (err) {
        logger.error("Error" + err);
      } else {
        logger.info("Success" + data.MessageId);
      }
    });
  }

早些时候我尝试使用异步等待而不是承诺,但仍然无法按预期工作

我得到的结果是

sucess++++ sucesss

并在此之后终止而不发布消息。如果我在处理程序中使用 timeout() 并让函数等待,那么它工作正常。

它不起作用的任何原因。

标签: javascriptnode.jsaws-lambda

解决方案


推荐阅读