Я столкнулся с проблемой при использовании библиотеки обещания-mysql в лямбда-aws.
Это для обновления функций лямбда с узла 4.3 до узла 10.x и использует "обещание-mysql": "^ 4.1.0 "
код делает что-то вроде этого ...
mysql.createConnection({
host : RdsHost,
user : RdsUser,
password : RdsPassword,
database : RdsDatabase
}).then((conn) => {
connection = conn; // defined earlier
return connection;
})
.then(() => {
var ffff = new FFFF(connection); // passes in connection
return ffff.getRows(); // runs query via connection
})
.then((rows) => {
...
})
.then(() => {
var pppp = new PPPP(connection); // passes in connection
return pppp.getRows(); // runs query via connection
})
.then((rows) => {
xxxx = rows;
})
.then(() => {
if(connection) connection.end(); // <- if timeout failure does NOT fall over into .catch
console.log('Result is ', xxxx);
return context.succeed(xxxx);
})
.catch(function(err){
if(connection) connection.end();
console.log(err);
return context.fail(new Error(configuration.ApiGatewayErrorRegex + 'Could not process the query' + err));
});
есть проблема с отскоком клавиш на экране, что я в конечном итоге, но не могу прямо сейчас.
лямбда работает и получает результат, но когда вызывается .end (), он возвращает следующие ошибки:
'ERROR Unhandled Promise Rejection'
'Error: Quit inactivity timeout'
'PROTOCOL_SEQUENCE_TIMEOUT'
это происходило в предыдущей версии кода (node4.3), но не былозатопление мониторинга сообщениями об ошибках и rds.
, чтобы уменьшить количество сообщений об ошибках и rds, мне пришлось сделать что-то вроде следующего ...
.then(() => {
if(connection) return new Promise( ( resolve, reject ) => {
connection.end( err => {
if ( err ) return reject( err );
resolve();
}).then(() => {
console.log('Result is (e):', xxxx);
return context.succeed(xxxx);
});
});
//fall-through
console.log('Result is:', xxxx);
return context.succeed(xxxx);
})
.catch(function(err){
if(connection) return new Promise( ( resolve, reject ) => {
connection.end( err => {
if ( err ) return reject( err );
resolve();
}).then(() => {
console.log(err);
return context.fail(new Error(configuration.ApiGatewayErrorRegex + 'Could not process the query' + err));
});
});
//fall-through
console.log(err);
return context.fail(new Error(configuration.ApiGatewayErrorRegex + 'Could not process the query' + err));
});
, что кажется неудовлетворительным, учитываяя бы подумал, что .catch () справился бы с этим условием.
[ed: дальнейшее тестирование показывает, что в любом случае это практически не имеет значения].
часть проблемы заключается в том, что код должен возвращатьcontext.succeed илиcontext.failure и поэтому материал обещания стал чрезвычайно многословным, чтобы приспособиться к этому.
я пробовал .destroy () вместо .end (), и это сработало, так как .destroy () не возвращает обещание. однако я хотел, чтобы код был как можно ближе к исходной версии.
[ed] Я также пытался (предлагается в другом месте) сделать connection.end (function (err) {}) или аналогичный, но это такжене сработало.
У кого-нибудь были подобные проблемы, и если да, то у вас было лучше обойтись?