【问题标题】:AWS Lambda call 3 async functions by 1 Lambda callAWS Lambda 通过 1 个 Lambda 调用调用 3 个异步函数
【发布时间】:2021-06-04 04:42:22
【问题描述】:

好的,我已经完成了。请有人帮助我:(

不知道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 回调中解决任何问题。但是,如果您只是使用 SDK 的承诺变体,例如,您不需要这样做。 return DynamoDb.batchWriteItem(...).promise().
  • @jarmod 我以前试过,我又试了一次。从字面上看没有任何改变,一切都像以前一样工作
  • 另外,await httprequest(steamTicket).then((data) 也不正确。你要么等待,要么使用 then。
  • 好的,这个问题解决了。如何?同上。为什么?同上。但我在httprequest(steamTicket).then... 通话之前添加了return。我在PutToDB(sessionId, steamId); 通话之前添加了return。现在它按预期工作。
  • 无论如何,谢谢大家的帮助

标签: javascript node.js amazon-web-services aws-lambda


【解决方案1】:

您需要在DynamoDb.batchWriteItem 调用中调用reject/resolve。

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();
        }
    })
}) 

【讨论】:

  • 什么都没有改变 :( 字面上什么都没有
猜你喜欢
  • 2016-12-31
  • 2020-03-04
  • 2021-12-30
  • 2016-09-18
  • 1970-01-01
  • 2021-08-31
  • 2017-01-01
相关资源
最近更新 更多