结合两个lambda函数

问题描述:

我正在编写将连接API网关和DynamoDB的代码。他们如下。结合两个lambda函数

将数据

var body = JSON.parse(event.body); 
    console.log(body.phone) 
    var table = "userAddresses"; 
    var params = { 
     TableName: table, 
     Item: { 
      "phone": body.phone, 
      "apartmentNumber": body.apartmentNumber, 
      "buildingNumber": body.buildingNumber, 
      "state": body.state, 
      "zip": body.zip 
     } 
    } 

    docClient.put(params, function (err, data) { 
     if (err) { 
      console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2)); 
     } else { 
      console.log("GetItem succeeded:", JSON.stringify(data, null, 2)); 
      var res = { 
       "statusCode": 200, 
       "headers": {}, 
       "body": JSON.stringify(data) 
      }; 
      context.succeed(res); 
     } 
    }); 

获取数据

var body = JSON.parse(event.body); 
    console.log(body.phone) 
    var table = "userAddresses"; 
    var params = { 
     TableName: table, 
     Item: { 
      "phone": body.phone 
     } 
    } 
    docClient.get(params, function (err, data) { 
     if (err) { 
      console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2)); 
     } else { 
      console.log("GetItem succeeded:", JSON.stringify(data, null, 2)); 
      var res = { 
       "statusCode": 200, 
       "headers": {}, 
       "body": JSON.stringify(data) 
      }; 
      context.succeed(res); 
     } 
    }); 

而在我的API网关我创建的资源和方法,并指出他们相应的功能,但现在我m想用2种方法创建一个通用的lambda函数,如function putData()function getData(),并将它们指向适当的方法,而不是指向不同的方法Lambda函数。我试图通过遵循https://kennbrodhagen.net/2015/12/02/how-to-access-http-headers-using-aws-api-gateway-and-lambda/获得HTTP method,然后写为if(method==="GET"){...} else {...},但不幸的是,我无法获取方法名称本身。

请帮我一下,我该如何做到这一点。

感谢

你有你的API网关将通过请求方法值添加映射。这可能会在每个端点的映射中被硬编码。

确切的添加方式取决于当前映射的结构。

本指南应该是一个有益的起点:http://docs.aws.amazon.com/apigateway/latest/developerguide/getting-started-mappings.html

没有必要创建自定义的映射模板。在资源的“集成请求”中,请确保选中“使用Lambda代理集成”复选框。

比方说,你lambda函数如下:

// NodeJS lambda function 

exports.handler = function(event, context, callback) { 
    // ...your application code... 
}; 

随着“使用LAMBDA代理一体化”的启用,event参数将包括HTTP请求的细节你的函数执行时。然后,您将有机会获得event.httpMethodhttp://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-simple-proxy-for-lambda-input-format

// Sample `event` for GET request 

{ 
    "path": "/test/hello", 
    "headers": { 
     "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", 
     "Accept-Encoding": "gzip, deflate, lzma, sdch, br", 
     "Accept-Language": "en-US,en;q=0.8", 
     "X-Forwarded-For": "192.168.100.1, 192.168.1.1", 
     "X-Forwarded-Port": "443", 
     "X-Forwarded-Proto": "https" 
    }, 
    "pathParameters": {"proxy": "hello"}, 
    "requestContext": { 
     "accountId": "123456789012", 
     "resourceId": "us4z18", 
     "stage": "test", 
     "requestId": "41b45ea3-70b5-11e6-b7bd-69b5aaebc7d9", 
     "identity": { 
      "accountId": "", 
      "sourceIp": "192.168.100.1", 
      "userArn": "", 
      "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48", 
      "user": "" 
     }, 
     "resourcePath": "/{proxy+}", 
     "httpMethod": "GET", 
     "apiId": "wt6mne2s9k" 
    }, 
    "resource": "/{proxy+}", 
    "httpMethod": "GET", 
    "queryStringParameters": {"name": "me"}, 
    "stageVariables": {"stageVarName": "stageVarValue"} 
} 

注:在使用代理服务器的整合,传递给lambda函数回调的数据必须在一个特定的模式被格式化,所列出的位置:

http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-simple-proxy-for-lambda-output-format

{ 
    "isBase64Encoded": true|false, 
    "statusCode": httpStatusCode, 
    "headers": { "headerName": "headerValue", ... }, 
    "body": "..." 
}