首页 > 解决方案 > 无法让 Lambda 函数发回信息

问题描述

我刚刚编写了我的第一个 Lambda 函数,但此时它不起作用。我在代码中尝试了许多变体;部分追随我能想到的,部分追随我在网上可能遇到的;但都失败了。

我希望 Lambda 函数列出 UserPool 中的用户并获取作为参数传递的给定子的电子邮件。

这是调用 Lambda 函数的 Swift 函数:

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

这是 Lambda 函数:

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())。

标签: iosswiftamazon-web-servicesaws-lambda

解决方案


您需要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
}

否则,您的 Lambda 函数会在执行回调之前返回(JavaScript 的异步性质)。


推荐阅读