AWS лямбда и обещание-MySQL - PullRequest
0 голосов
/ 06 ноября 2019

Я столкнулся с проблемой при использовании библиотеки обещания-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) {}) или аналогичный, но это такжене сработало.

У кого-нибудь были подобные проблемы, и если да, то у вас было лучше обойтись?

...