2016-09-02 5 views
3

Я запускаю функцию nodejs в Amazon Lambda. Предполагается сделать вставку в mysql DB после HTTP-получения. Кажется, что все в порядке - глядя на журналы облачного прослушивания, запрос анализируется правильно, и если я скопирую запрос в консоль 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(); 

Проблема в том, что версия Lambda просто ничего не делает. Запрос виден и корректен, и функция возвращает чисто, но он никогда ничего не вставляет. У меня такая же проблема с запросом на обновление, но все mysql выбирает работу и возвращает материал, поэтому проблема не в этом. Вставка также работает, когда я запускаю ее на своей машине - когда я нажимаю ее на лямбда, проблема возникает.

Я попытался добавить отдельный оператор фиксации, но не смог заставить его работать. Я явно что-то пропустил, но не могу понять, что. Нужно ли иметь блок транзакций для обновлений?

РЕДАКТИРОВАТЬ по запросу Бр. Я думаю, что я старался быть умнее, чем я, показывая только часть кода. Вся логика:

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

По рекомендации, приведенной здесь, я внесла следующие изменения. Я снял последний обратный вызов и поставил обратные вызовы внутри обоих соединений. 0:

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

И, похоже, сработает. Теперь я предполагаю, что команда фиксации ничего не делает, но она, похоже, тоже не сломает ее. Вероятно, на данный момент очевидно, что я не разработчик и даже менее знакомый с 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

Спасибо. Я знаю об асинхронности, и я использую обратный вызов в структуре, но я не уверен, что делаю это правильно. Но если я отправляю запрос в БД, не должен ли он работать, даже если вызывающий объект завершает работу? – svj

+2

Ну, вы инициируете запрос, вызвав функцию 'query()', но если обратный вызов, который должен обрабатывать результат, был прерван (поскольку область функций, в которой был создан обратный вызов, была возвращена), тогда вы отсутствуете удачи. – matsev

+1

Глядя, что более близко, я думаю, он решил мою проблему. У меня было два похожих запроса подряд и у меня был обратный вызов() вне запросов в конце «блока транзакций». Теперь, когда есть callback внутри connection.query(), он работает. Спасибо, и вы правы в отношении обработки ошибок, которые я хочу добавить, но не для этого примера. – svj

Смежные вопросы