2016-09-02 370 views
3

我在Amazon Lambda中運行nodejs函數。它應該在HTTP獲取後向MySQL DB插入。一切似乎都很好 - 看着cloudwatch日誌查詢正確解析,如果我複製粘貼查詢到mysql控制檯它確實是它應該。Mysql插入AWS Lambda + Node.js

本質:

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

的問題是,拉姆達版本根本什麼都不做。查詢是可見和正確的,並且該函數乾淨地返回,但它從不實際插入任何東西。我也有與更新查詢相同的問題,但所有的MySQL選擇工作和返回的東西,所以問題不是這樣。當我在我的機器上運行它時,插入也可以工作 - 當我將它推到lambda時,問題就會出現。

我試圖添加一個單獨的提交語句,但無法讓它工作。我顯然錯過了一些東西,但無法弄清楚什麼。我需要有更新的交易區塊嗎?

編輯:Per 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"}) 
    }); 

而且它似乎工作。我現在猜測,commit -part什麼都不做,但它似乎也沒有破壞它。在這一點上可能很明顯,我不是一個開發人員,對node.js也不那麼熟悉,所以我真的很感謝我的幫助!

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

順便說一句,因爲你和λ的工作,同樣的道理也適用於callback()context.succeed()context.fail()function handlers。換句話說,您很可能會在上面寫出關於錯誤和結果處理的意見的地方給他們打電話。

+0

謝謝。我知道異步,我在結構中使用回調 - 但我不知道我做的是否正確。但是,如果我向DB發送請求,即使主叫實體退出,它也不應該運行它。 – svj

+2

那麼,通過調用'query()'函數來啓動請求,但是如果應該處理結果的回調被終止了(因爲回調被創建的函數範圍已經返回),那麼你就不在的運氣。 – matsev

+1

仔細看,我認爲它解決了我的問題。我在一行中有兩個類似的查詢,並且在「事務塊」末尾的查詢之外有回調()。現在在connection.query()中有回調函數。謝謝 - 你對我想添加的錯誤處理是正確的,但沒有爲這個例子。 – svj