2016-11-07 1 views
1

Wir haben eine einfache Abfrage zum Abrufen von Informationen aus unserer Datenbank mit einer serverlosen Anwendung, die auf nodejs implementiert ist. Leider kann ich keine Antwort von Bluebird bekommen - die Antwort läuft immer aus und ich bin mir nicht sicher, was das Problem verursachen könnte. Hier sind meine Dateien:Bluebird mit Lambda gibt keine Daten zurück

serverless.yml:

service: myAuth0 

provider: 
    name: aws 
    iamRoleARN: arn:aws:iam::XXXXXXXXX:role/test-role 
    runtime: nodejs4.3 
    stage: production 
    region: us-us-1 
    iamRoleStatements: 
    - Effect: "Allow" 
     Action: 
     - "ec2:CreateNetworkInterface" 
     - "ec2:DescribeNetworkInterfaces" 
     - "ec2:DeleteNetworkInterface" 
     Resource: "*" 
    vpc: 
    securityGroupIds: 
     - ${self:custom.${opt:stage, self:provider.stage}.${opt:region, self:provider.region}.vpc.securitygroup} 
    subnetIds: 
     - ${self:custom.${opt:stage, self:provider.stage}.${opt:region, self:provider.region}.vpc.subnet1} 
     - ${self:custom.${opt:stage, self:provider.stage}.${opt:region, self:provider.region}.vpc.subnet2} 

custom: 
    production: 
    us-east-1: 
     vpc: 
     subnet1: subnet-11111111 
     subnet2: subnet-22222222 
     securitygroup: sg-33333333 

functions: 
    getUserRoles: 
    handler: app/handler.handle 
    events: 
     - http: 
      method: get 
      path: userstest/roles 

handler.js:

'use strict'; 

require('dotenv').config(); 
var Promise = require('bluebird'); 
var getConn = require('./dbConn'); 

module.exports.handle = (event, context, callback) => { 
    Promise.using(getConn(), function(conn){ 
    return conn.query('select ert.name from emp_roles ert order by ert.name').then(function(rows){ 
     let roles = []; 
     rows.forEach(function(row){ 
     roles.push(row.name); 
     }); 
     return roles; 
    }).catch(function(err){ 
     console.log(error); 
    }); 
    }).then(function(roles){ 
    console.log("found roles: " + roles); 
    callback(null, {roles: roles}); 
    }); 
}; 

dbConn.js:

var mysql = require('promise-mysql'); 
var pool = mysql.createPool({ 
    connectionLimit: 10, 
    host  : process.env.MYSQL_HOST, 
    user  : process.env.MYSQL_USER, 
    password : process.env.MYSQL_PW, 
    database : process.env.MYSQL_DB 
}); 

function getConn() { 
    return pool.getConnection().disposer(function(connection) { 
    pool.releaseConnection(connection); 
    }); 
} 

module.exports = getConn; 

Ich habe Konsolenprotokolleinträge hinzugefügt, und ich kann sehen, dass es sie vervollständigt ... aber es gibt nichts zurück und ich habe einen Verbindungsfehler. Ich sehe, dass die Daten abgerufen werden und Lambda sitzt einfach da, ohne etwas für 6 Sekunden zurückzugeben. Unten ist der neueste Eintrag von Cloud Uhr:

18:15:01 START RequestId: 195a7218-a516-11e6-b52d-5f028bb2bdf6 Version: $ AKTUELLE 18.15.01 2016-11-07T18: 15: 01.820Z 195a7218-a516-11e6-b52d-5f028bb2bdf6 Rollen gefunden: 9 18.15.07 END RequestId: 195a7218-a516-11e6-b52d-5f028bb2bdf6 18.15.07 REPORT RequestId: 195a7218-a516-11e6-b52d -5f028bb2bdf6 Dauer: 6002,14 ms Berechnete Dauer: 6000 ms Speichergröße: 1024 MB Maximal belegter Speicher: 18 MB 18:15:07 2016-11-07T18: 15: 07.468Z 195a7218-a516-11e6-b52d-5f028bb2bdf6 Aufgabe Zeitüberschreitung nach 6,00 Sekunden

Gibt es etwas, das bei der Verwendung von Bluebird mit Lambda bricht?

Antwort

0

Bluebird funktioniert definitiv.

Ich denke, es könnte ein Problem mit der Beendigung der Verbindung mit Entsorger sein. Ich benutze postgresql Versprechen Bibliothek so kann nicht wirklich mit mysql versuchen, aber ich schrieb es um Disponent zu verwenden und ich bekomme die gleiche Zeitüberschreitung.

Versuchen Sie die Verbindung in Ihrem finally Block zu beenden.

EDIT: Ok, tatsächlich release Verbindungen ist schlecht in Lambdas, sollten Sie sie beenden. mysqljs docs sagen:

Wenn Sie mit einer Verbindung durchgeführt werden, nur connection.release() nennen und die Verbindung wird an den Pool zurückgegeben, bereit, wieder andere von jemandem verwendet werden.

Das wollen Sie nicht wirklich. Deshalb bekommst du eine Auszeit. Wenn Ihre Versprechungskette endet, kehrt die Verbindung zum Pool zurück und WAITS wird erneut verwendet, also Lambda-Timeouts, da es nie endet.

Verwendung connection.end() oder connection.destroy()

+0

Danke ... leider noch mal auf den Rückruf (cb): var Versprechen = erfordern ('bluebird'); var pool = require ('./ dbConn'); module.exports.handle = (Ereignis, Kontext, cb) => { pool.getConnection(). Dann (Funktion (conn) { conn.query (Abfrage) .then (Funktion (Zeilen) { lassen Rollen = []; rows.forEach (Funktion (Zeile) { roles.push (row.name); }); cb (null, {Rollen: Rollen}); }). Catch (function (err) { console.log (Fehler);. }) schließlich (function() { pool.releaseConnection (conn); }); }) catch (function (e) { Rückruf (e);. }) ; }; –

+0

Was ist mit Ihrem neuen dbConn, wie sieht das aus? EDIT: Ich denke, es gibt nur einen Pool zurück. – Erndob

+0

@DavidD Ich aktualisierte meine Antwort. – Erndob

0

Nur eine Notiz über die akzeptierte Antwort: Es ist nicht eine DB-Verbindung mit dem finally-Block zu lösen empfohlen.Falls im Lebenszyklus der Versprechenskette etwas kaputt geht, besteht die Möglichkeit, dass finally nicht als Ursache für Ressourcenlecks bezeichnet wird. Dies ist dokumentiert in bluebird docs: http://bluebirdjs.com/docs/api/resource-management.html

Verwandte Themen