AWS Lambda всегда возвращает ноль на Android - PullRequest
1 голос
/ 05 июня 2019

Я создаю приложение на iOS и Android, используя AWS Amplify. У меня есть лямбда-выражение, которое принимает долготу, широту, имя пользователя, идентификатор объекта и возвращает мне логическое значение, которое говорит мне, если да или нет, пользователь физически близок к этому объекту.

Он отлично работает в моем приложении для iOS, я получаю true или false в зависимости от местоположения пользователя, но на Android я всегда получаю null в качестве ответа.

Вот моя функция, которая запускает мою лямбду:

fun locationLambda() {
    if ( ContextCompat.checkSelfPermission( this, Manifest.permission.ACCESS_FINE_LOCATION ) == PackageManager.PERMISSION_GRANTED ) {
        fusedLocationClient.lastLocation.addOnSuccessListener { location : Location? ->
            if (location != null) {

                val latitude = location.latitude.toString()
                val longitude = location.longitude.toString()
                val username = AWSMobileClient.getInstance().username
                val objectId = (intent.extras.getSerializable("object") as Object).getId()

                Log.i("ObjectId", objectId)
                Log.i("Longitude", longitude)
                Log.i("Latitude", latitude)
                Log.i("Username", username)

                mAWSAppSyncClient?.query(IsObjectFoundQuery.builder()
                        .latitude(latitude)
                        .longitude(longitude)
                        .username(username)
                        .objectID(objectId)
                        .build())
                        ?.responseFetcher(AppSyncResponseFetchers.NETWORK_ONLY)
                        ?.enqueue(locationCallback)
            }
        }
    }
}

Когда я печатаю в логах параметры, отправленные в лямбду, все нормально, отправляются правильные значения.

А вот моя функция обратного вызова:

private val locationCallback = object : GraphQLCall.Callback<IsObjectFoundQuery.Data>() {
    override fun onResponse( response: com.apollographql.apollo.api.Response<IsObjectFoundQuery.Data>) {
        Log.i("Results", response.data()?.isObjectFound.toString())
    }

    override fun onFailure(e: ApolloException) {
        Log.e("ERROR", e.toString())
    }
}

Здесь я успешно получил ответ, но response.data()?.isObjectFound - это null

Я что-то здесь не так делаю или мне нужно искать где-то еще?

1 Ответ

1 голос
/ 05 июня 2019

Устранение неисправностей лямбда-функции без регистрации немного похоже на поиск чего-либо в темноте: это очень сложно.Вам понадобится ведение журнала на стороне клиента и на стороне сервера (он-же бэкэнд), чтобы иметь возможность устранить эту проблему.

Для ведения журнала бэкэнда AWS предоставляет Журналы Cloudwatch для Lambda иAPI-шлюз.

Чтобы проверить журналы Cloudwatch на наличие лямбды, перейдите в консоль AWS для региона, в котором установлена ​​ваша лямбда, и перейдите в службу Cloudwatch.Затем выберите Журналы на стороне.Вы должны увидеть группу журналов, названную для вашей лямбда-функции.Нажатие на это покажет вам диагностическую информацию, собранную для вашей лямбды, когда она вызывается (см. Пример ниже).Разверните и сверните записи строки журнала.enter image description here

После того, как вы подтвердите, что у вас включены журналы Cloudwatch, следуйте этой стратегии:

  1. Выполните тестовый вызов из клиента IOS иподтвердите, что вывод успешен на клиенте.Затем проверьте журналы cloudwatch (как для шлюза API, так и для функции Lambda) вашего теста IOS и обратите внимание на то, как выглядит успех.

  2. Затем запустите второй тест из Android, используя свой кодвыше.Посмотрите в cloudwatch различия между ними, и это должно раскрыть детали, которые помогут вам устранить неполадки в вызове Android.

Если Amplify не создавала журналы Cloudwatch для вашего шлюза API илиЛямбда-функция, выполните шаги здесь при их настройке.Надеюсь, это поможет вам найти решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...