Не удается получить лямбда-функцию для отправки обратной информации - PullRequest
0 голосов
/ 04 июня 2019

Я только что написал свою первую функцию Lambda, но на данный момент она не работает. Я попробовал несколько вариантов в коде; частично следуя тому, что я мог придумать, и частично следуя тому, что я мог встретить в сети; но все не удалось.

Я хочу, чтобы лямбда-функция выводила listUsers в UserPool и получала электронное письмо для данного подпрограммы, переданного в качестве параметра.

Вот функция Swift, вызывающая функцию Lambda:

func getLambdaInfo() {
    let lambdaInvoker = AWSLambdaInvoker.default(),
    jsonObject:[String: Any] =  ["sub" : "MY-USER-SUB"]

    lambdaInvoker.invokeFunction("myLambdaFunc", jsonObject: jsonObject)
        .continueWith(block: {
            (task:AWSTask<AnyObject>) -> Any? in
            if( task.error != nil) {
                print("Error: \(task.error!)")
                return nil
            }

            print("\(#function) ---- WE ARE HERE!!!!")

            // Handle response in task.result:
            if let JSONDictionary = task.result as? NSDictionary {
                print("Result: \(JSONDictionary)")
            }

            return nil
        })
}

Вот лямбда-функция:

var AWS = require('aws-sdk/dist/aws-sdk-react-native');

exports.handler = async (event,context) => {
    var params = {
        UserPoolId: 'MY-POOL-ID',
        AttributesToGet: ['email'],
        Limit: '2'
    };

    var cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider();

    cognitoidentityserviceprovider.listUsers(params, function(err, data) {
      if (err) console.log(err, err.stack); // an error occurred
      else     console.log(data);           // successful response
      // How can I get this data sent in the response is probably the issue ??
    });

    const response = {
        inBound: event.sub,
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!')
    };

    return response;
}

Вот что можно увидеть в консоли отладки Xcode:

getLambdaInfo() ---- WE ARE HERE!!!!
Result: {
    body = "\"Hello from Lambda!\"";
    inBound = "MY-USER-SUB";
    statusCode = 200;
}

Я надеюсь, что кто-то с большим количеством AWSLambda, чем я, сможет дать мне несколько советов относительно изменений, которые мне нужно внести в мой код, чтобы получить результат (адрес электронной почты), который я хочу (в моем Swift getLambdaInfo ()).

1 Ответ

4 голосов
/ 04 июня 2019

Вам необходимо переместить ваш оператор return в обратный вызов listUsers:

cognitoidentityserviceprovider.listUsers(params, function(err, data) {
  if (err) {
    console.log(err, err.stack); // an error occurred
    // return a 500 error ?
  }
  else {
    console.log(data);
    const response = {
      inBound: event.sub,
      statusCode: 200,
      body: JSON.stringify(data)
    }
    return response;
  }
});

Поскольку вы используете шаблон async, вы также можете сделать:

try {
  const data = await cognitoidentityserviceprovider.listUsers(params).promise() // note the await and .promise() here
  const response = {
    inBound: event.sub,
    statusCode: 200,
    body: JSON.stringify(data)
  }
  return response;
} catch (err) {
 // do something with err
}

В противном случае ваша лямбда-функция возвращается до выполнения обратного вызова (асинхронная природа JavaScript).

...