2017-02-07 6 views
1

私が働く会社は、現在、既存のコードベースをAWS Lambdaに移行しようとしています。我々はnode.js 4.3(ラムダ用に提供された最高のバージョン)を実行しており、VPC内で実行してRDSデータベースに接続しています。ラムダ関数はデータベースに接続していますが、MySQLテーブルへの単純な選択クエリはエラーを実行したり返したりしません。AWS Lambdaがnode.jsを実行していない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 :)"); 
} 

私が述べたように、このすべての奇妙な部分は、私はラムダから取得応答の欠如である:ここでは、しようとしているコードです。これは私に教えてくれるすべてです:

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 

アドバイスは素晴らしいでしょう。ありがとうございました。

+2

まず:

コードが何をするかを見ずに

、私はこのコードをテストしていない、あなたはのラインでより多くの何かを必要とするすべてのモジュールの初期化は、あなたのハンドラ関数外で行う必要があります。 2番目:コールバックの仕組みを読む必要があります。 context.doneを呼び出す前にコールバックが呼び出されるのを待っているわけではありません。私の提案は、javascript/nodeコールバックとその使い方を読み上げることです。 – doorstuck

答えて

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); 
      } 
     }); 


     } 
}); 


} 
+0

これはうまくいきました、ありがとう!コールバックについてもう少し詳しくお読みください。 – trevorcrupi

+0

connection.end(); //これは私にとって魔法でした – antonio

関連する問題