簡體   English   中英

AWS Lambda 通過 1 個 Lambda 調用調用 3 個異步函數

[英]AWS Lambda call 3 async functions by 1 Lambda call

好了,我完成了。 請有人幫助我:(

不知道js和lambda是怎么工作的

我必須做的:

  1. 發送 GET 請求並獲得響應。
  2. 將響應中的數據寫入 DynamoDb

我可以 1by1 做到這一點,但不能通過 1 個 lambda 調用來做所有事情。

我的代碼:

const https = require('https');
const crypto = require("crypto");
const AWS = require('aws-sdk');
const DynamoDb = new AWS.DynamoDB({region: 'eu-central-1'});

exports.handler = async (event) => {
    let response;
    
    console.log("Start");
    
    let steamTicket;
    let steamId;
    
    if(event.body){
        const body = JSON.parse(event.body);
        
        if(body.steamticket && body.steamid){
            steamTicket = body.steamticket;
            steamId = body.steamid;
        }
        else{
            response = {
                statusCode: 400,
                body: JSON.stringify({
                    authenticated: false,
                    reason: 'cant find steamid or steamticket in your request'
                })
            };
            return response;
        }
    }
    else{
        response = {
            statusCode: 400,
            body: JSON.stringify({
                authenticated: false,
                reason: 'cant find request body'
            })
        };
        return response;
    }
    
    
    await httprequest(steamTicket).then((data) =>{
        if(data.response && data.response.params){
            if(data.response.params.result == 'OK' && data.response.params.steamid == steamId){
                console.log(JSON.stringify(data));
                
                const sessionId = crypto.randomBytes(16).toString("hex");
                console.log('Generated session id: ' + sessionId);
                
                PutToDB(sessionId, steamId);
            }
            else{
                response = {
                    statusCode: 400,
                    body: JSON.stringify({
                        authenticated: false,
                        reason: 'steam response is not OK or session != steamId'
                    })
                };
                return response;
            }
        }
        else{
            response = {
                statusCode: 400,
                body: JSON.stringify({
                    authenticated: false,
                    reason: 'invalid response from steam: ' + JSON.stringify(data)
                })
            };
            return response;
        }
    });
};

async function PutToDB(sessionId, steamId){
    
    var WriteParams = {
        RequestItems:{
            SteamSessions: []
        }
    };
    
    WriteParams.RequestItems.SteamSessions.push({
        PutRequest:{
            Item: {
                SteamId: {S: steamId},
                SessionId: {S: sessionId},
                ttl: {N: (Math.floor(Date.now() / 1000) + 600).toString()}
            }
        }
    });

    console.log('SessionIdToWrite: ' + sessionId);
    return new Promise((resolve, reject) =>{
        DynamoDb.batchWriteItem(WriteParams, function(err, data){
            if(err){
                console.log("Error", err);
            }
            else{
                console.log("Success write", JSON.stringify(data));
            }
        })
    }) 
}

async function httprequest(steamTicket) {
     return new Promise((resolve, reject) => {
        const options = {
            host: 'partner.steam-api.com',
            path: '/ISteamUserAuth/AuthenticateUserTicket/v1/?key=somekey&appid=someid&ticket=' + steamTicket,
            port: 443,
            method: 'GET'
        };
        
        const req = https.request(options, (res) => {
          if (res.statusCode < 200 || res.statusCode >= 300) {
                return reject(new Error('statusCode=' + res.statusCode));
            }
            
            var body = [];
            
            res.on('data', function(chunk) {
                body.push(chunk);
            });
            
            res.on('end', function() {
                try {
                    body = JSON.parse(Buffer.concat(body).toString());
                } catch(e) {
                    reject(e);
                }
                resolve(body);
            });
        });
        req.on('error', (e) => {
          reject(e.message);
        });
        // send the request
       req.end();
    });
}

我已經迷路了,我什至不確定它應該像那樣工作。

最令人困惑的是:這個 b 給了我這個測試結果:

運行 1:

2021-03-05T13:28:47.741Z    INFO    Start
2021-03-05T13:28:48.612Z    INFO    {"response":{"params":{"result":"OK","steamid":"mysteamid","ownersteamid":"mysteamid","vacbanned":false,"publisherbanned":false}}}
2021-03-05T13:28:48.650Z    INFO    Generated session id: 6a5633a5f862d8663d0fe546a9c89feb
2021-03-05T13:28:48.650Z    INFO    SessionIdToWrite: 6a5633a5f862d8663d0fe546a9c89feb

DynamoDb 是空的,這里我們看不到來自 DynamoDb.batchWriteItem 結果的日志。

運行 2:

2021-03-05T13:29:53.308Z    INFO    Start
2021-03-05T13:29:53.674Z    INFO    Success write {"UnprocessedItems":{}}
2021-03-05T13:29:54.048Z    INFO    {"response":{"params":{"result":"OK","steamid":"mysteamid","ownersteamid":"mysteamid","vacbanned":false,"publisherbanned":false}}}
2021-03-05T13:29:54.048Z    INFO    Generated session id: 05c62de782202fc100cea9d47e38242c
2021-03-05T13:29:54.048Z    INFO    SessionIdToWrite: 05c62de782202fc100cea9d47e38242c

在第二次運行之后,我可以從 FIRST RUN (6a5633a5f862d8663d0fe546a9c89feb) 中看到 DynamoDb sessionId

如果我再次運行它,將會有第二次運行的 id

我認為它會在新運行時繼續運行以前的任務? 或者是什么? 我迷路了

謝謝你的幫助

您需要在DynamoDb.batchWriteItem調用中調用拒絕/解析。

return new Promise((resolve, reject) =>{
    DynamoDb.batchWriteItem(WriteParams, function(err, data){
        if(err){
            console.log("Error", err);
            reject(err);
        }
        else{
            console.log("Success write", JSON.stringify(data));
            resolve();
        }
    })
}) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM