【问题标题】:AWS Lambda not executing node.js MySQL queriesAWS Lambda 不执行 node.js MySQL 查询
【发布时间】:2017-06-24 05:10:17
【问题描述】:

我工作的公司目前正在尝试将我们现有的一些代码库迁移到 AWS Lambda。我们正在运行 node.js 4.3(为 lambda 提供的最高版本),并且我们在 VPC 内执行以连接到 RDS 数据库。 Lambda 函数可以很好地连接到数据库,但是对我们的 MySQL 表的简单选择查询没有执行或返回任何错误。这是我们正在尝试的代码:

exports.handler = (event, context, callback) => {

  /**
   * Require Config file
  **/
  var config = require('./config.js');

  /**
   * AWS/MWS Configuration
  **/
  var AWS = require('aws-sdk');
  var MWS = require('mws');

  var mws           = require('./lib/mws-reports/lib/mws.js');
  var XML           = require('./lib/mws-reports/pixl-xml');
  var mwsReportsAPI = require('./lib/mws-reports/lib/reports.js');
  var mwsFeedsAPI   = require('./lib/mws-reports/lib/feeds.js');

  AWS.config.region      = config.AWS.region;
  AWS.config.credentials = config.AWS.credentials;

  var client = new mws.Client(
    config.MWS.credentials.accessKeyId,
    config.MWS.credentials.secretAccessKey,
    config.MWS.credentials.sellerID,
    {}
  );

  /**
   * Configure DB
   * @var Promise - A library to maintain Promises (used for chained MySQL queries)
   * @var Utils - A wrapper for utility functions.
   * @var connection - The MySQL DB Connection
  **/
  var Promise = require('bluebird');
  var utils   = require('./lib/Utils');
  var mysql = require('mysql');

  var MySQLConnection = mysql.createConnection(config.mysql);

  MySQLConnection.connect(function (err) {
    if(err) {
      console.log("Error connection: " + err.stack);
      return;
    }

    console.log("Connected as id " + connection.threadId);
  });

  var connection      = Promise.promisifyAll(MySQLConnection);
  var InventoryHealth = require('./app/models/InventoryHealth');
  var Items           = require('./app/models/Items');

  connection.query("SELECT * FROM items", function(err, rows) {
    rows.forEach(function(item) {
      console.log(JSON.stringify(item));
    });
  });

  connection.end();
  context.done(null, "Finished :)");
}

正如我所提到的,所有这一切中最奇怪的部分是我没有从 Lambda 得到响应。这就是它告诉我的全部内容:

START RequestId: f726f0ba-ecec-11e6-b0b3-9d51c554a5ac Version: $LATEST
2017-02-07T04:22:01.123Z    f726f0ba-ecec-11e6-b0b3-9d51c554a5ac    (node) crypto.createCredentials is deprecated. Use tls.createSecureContext instead.
END RequestId: f726f0ba-ecec-11e6-b0b3-9d51c554a5ac
REPORT RequestId: f726f0ba-ecec-11e6-b0b3-9d51c554a5ac  Duration: 4232.01 ms    Billed Duration: 4300 ms    Memory Size: 128 MB Max Memory Used: 22 MB

任何建议都会很棒。谢谢你。

【问题讨论】:

  • 首先:您应该在处理函数之外进行的所有模块初始化。第二:您需要了解回调是如何工作的。在调用 context.done 之前,您无需等待回调被调用。我的建议是阅读 javascript/node 回调以及如何使用它们。

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


【解决方案1】:

您没有正确使用回调。仔细阅读。并记住在处理程序之外初始化模块以更快地执行函数。

不看代码做了什么,我也没有测试过这段代码,你需要更多的东西:

  /**
   * Require Config file
  **/
  var config = require('./config.js');

  /**
   * AWS/MWS Configuration
  **/
  var AWS = require('aws-sdk');
  var MWS = require('mws');

  var mws           = require('./lib/mws-reports/lib/mws.js');
  var XML           = require('./lib/mws-reports/pixl-xml');
  var mwsReportsAPI = require('./lib/mws-reports/lib/reports.js');
  var mwsFeedsAPI   = require('./lib/mws-reports/lib/feeds.js');

  AWS.config.region      = config.AWS.region;
  AWS.config.credentials = config.AWS.credentials;

  var client = new mws.Client(
    config.MWS.credentials.accessKeyId,
    config.MWS.credentials.secretAccessKey,
    config.MWS.credentials.sellerID,
    {}
  );

  /**
   * Configure DB
   * @var Promise - A library to maintain Promises (used for chained MySQL queries)
   * @var Utils - A wrapper for utility functions.
   * @var connection - The MySQL DB Connection
  **/
  var Promise = require('bluebird');
  var utils   = require('./lib/Utils');
  var mysql = require('mysql');

  var InventoryHealth = require('./app/models/InventoryHealth');
  var Items           = require('./app/models/Items');

  exports.handler = (event, context, callback) => {

    var MySQLConnection = mysql.createConnection(config.mysql);

    MySQLConnection.connect(function (err) {
      if(err) {
        console.log("Error connection: " + err.stack);
        callback(err, err);
      } else {

        console.log("Connected as id " + connection.threadId);

        var connection      = Promise.promisifyAll(MySQLConnection);


        connection.query("SELECT * FROM items", function(err, rows) {
          if (err) {
            console.log(err);
            callback(err, err);
          } else {
            rows.forEach(function(item) {
              console.log(JSON.stringify(item));
            });
            connection.end();
            callback(null, rows);
          }
        });


      }
});


}

【讨论】:

  • 成功了,非常感谢!我一定会阅读更多关于回调的内容。
猜你喜欢
  • 2020-07-23
  • 1970-01-01
  • 2018-06-21
  • 2020-05-17
  • 2021-10-28
  • 2019-06-23
  • 2018-11-22
  • 2023-03-25
  • 1970-01-01
相关资源
最近更新 更多