使用AWS Lambda + Node.js

时间:2016-09-02 18:33:41

标签: node.js aws-lambda

我在Amazon Lambda中运行nodejs功能。它应该在HTTP get之后插入mysql DB。一切似乎都很好 - 查看cloudwatch日志,查询被正确解析,如果我将查询复制粘贴到mysql控制台,它就完全按照它应该做的。

本质:

var mysql = require('mysql')
var connection = createConnection({ connection details }); 
connection.connect();

var query = connection.query('Insert into AAA select * \
  from BBB where BBB.a = ?;', [parameter],
  function(err, result) {}
 );

connection.end();

问题在于Lambda版本什么都不做。查询是可见且正确的,函数返回干净但实际上从未插入任何内容。我也有同样的更新查询问题,但所有的mysql选择工作和返回的东西,所以问题不是那样。当我在我的机器上运行它时插入也有效 - 当我将它推到lambda时,问题出现了。

我尝试添加一个单独的提交语句,但无法使其正常工作。我显然遗漏了一些东西但却无法弄清楚是什么。我是否需要更新交易块?

编辑:按照Mark B的要求。我想通过仅显示部分代码,我试图比我更聪明。整个逻辑是:

exports.handler = function(event, context, callback){     
    if ( event.A == -1 ){
      exports.updateDB(event, function(res) {
        context.succeed(res) 
      }
    }
};

exports.updateDB = function(event, callback) {

  var mysql = require('mysql')
  var connection = createConnection({ connection details }); 
  connection.connect();

  var query = connection.query( 'update products set A=? where product_id = ?;',
  [parameters],
  function(err,result){ });

  var query = connection.query( 'insert into other_table select * from products where product_id = ?;',
  [parameters],
  function(err,result){ });         

  connection.commit(function(err) {
    if(err) { 
      connection.rollback(function() {
        throw(err);
      });
    }  
  connection.end();
  });
callback({"ok":"ok"})
};

根据这里给出的建议,我做了以下更改。我拿走了最后一个回调函数,并将回调放在了connection.queries:

   var query = connection.query( 'insert into other_table select * from products where product_id = ?;',
  [parameters],
  function(err,result){ 
     callback({"ok":"ok"}) 
  });  

它似乎有效。我现在猜测提交-part什么也没做,但它似乎也没有打破它。在这一点上可能很明显,我不是一个开发人员,甚至不太熟悉node.js所以我非常感谢我的帮助!

1 个答案:

答案 0 :(得分:4)

请注意,查询函数是一个异步函数,这意味着在触发回调函数之前它将不可用。在示例代码中,连接在触发后立即关闭,早在执行回调之前。尝试更改代码,以便在回调函数中关闭连接,例如

var query = connection.query('Insert into AAA select * \
  from BBB where BBB.a = ?;', [parameter],

  function(err, result) {

     // now it is ok to close the connection
     connection.end();

     if (err) {
        // error handling
     } 
     else {
        // do something with the result
     }
  }
 );

顺便说一下,由于您正在使用Lambda,因此同样适用于callback()context.succeed()context.fail() function handlers。换句话说,您可能想在上面写有关错误和结果处理的注释的地方调用它们。