2016-11-07 63 views
1

我們有一個簡單的查詢,使用部署在nodejs上的無服務器應用程序從我們的數據庫獲取信息。不幸的是,我無法獲得藍鳥承諾的任何迴應 - 迴應總是超時,我不確定可能導致問題的原因。下面是我的文件:Lambda沒有返回數據的藍鳥

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; 

我添加了控制檯日誌條目,我可以看到它完成了它們...但是它不會返回任何內容,並最終導致連接錯誤。我看到數據被提取,而Lambda只是坐在那裏,沒有任何東西返回6秒。下面是從雲觀看最新的條目:

18時15分01秒開始的requestId:195a7218-a516-11e6-b52d-5f028bb2bdf6 版本:$最新18點15分01秒2016-11-07T18:15: 01.820Z 195a7218-a516-11e6-b52d-5f028bb2bdf6找到角色:9 18時15分07秒結束 的requestId:195a7218-a516-11e6-b52d-5f028bb2bdf6 18時15分07秒報告 的requestId:195a7218-a516-11e6-b52d -5f028bb2bdf6持續時間:6002.14 ms 計費時長:6000 ms內存大小:1024 MB使用的最大內存:18 MB 18:15:07 2016-11-07T18:15:07.468Z 195a7218-a516-11e6-b52d-5f028bb2bdf6 任務6.00秒後超時

使用藍鳥與Lambda時是否有什麼突破?

回答

0

藍鳥絕對有效。

我想可能會有使用disposer結束連接的問題。我使用postgresql承諾庫,所以不能真正嘗試與MySQL,但我重寫它使用disposer,我得到相同的超時。

嘗試在finally塊中結束連接。

db.getConnection() 
    .then(doMyQuery) 
    .catch(catchErrors) 
    .finally(db.disposeConnection) 

編輯:好吧,實際上釋放連接在lambdas中是不好的,你應該結束它們。 mysqljs文檔說:

當你與一個連接完成,只需調用connection.release() ,連接將返回到池中,隨時可以通過 別人再使用。

你真的不想那麼做。這就是你超時的原因。當你的承諾鏈結束時,連接返回到池並等待再次使用,因此lambda超時,因爲它永遠不會結束。

使用connection.end()或connection.destroy()

+0

謝謝......不幸的是,它仍然在回調(cb)超時: var Promise = require('bluebird'); var pool = require('./ dbConn'); (函數(行)){ module.exports.handle =(event,context,cb)=> pool.getConnection()。然後(函數(conn){conn.query(query).then(function(rows){ let roles = []; rows.forEach(function(row){ roles.push(row.name); }); cb(null,{roles:roles}); })。catch(function(err){ 的console.log(誤差); })最後(函數(){ pool.releaseConnection(conn);在 });} )捕獲(功能(E){ 回調(e)中; }) ; }; –

+0

你的新dbConn怎麼樣,看起來如何?編輯:我想它現在只是返回一個池。 – Erndob

+0

@DavidD我更新了我的答案。 – Erndob