我正在使用AWS Amplify在iOS和Android上构建应用程序。我有一个lambda表达式,该表达式需要一个经度,一个纬度,一个用户名,一个对象ID,并返回一个布尔值,告诉我是或否用户在物理上接近该对象。
它可以完美地在我的iOS应用上运行,根据用户位置,我得到true
或false
,但是在Android上,我总是得到null
作为响应。
这是触发我的lambda的函数:
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)
}
}
}
}
当我在日志中打印发送到lambda的参数一切正常时,将发送正确的值。
这是我的回调函数:
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
我在这里做错什么了吗?还是必须去别的地方看看?
答案 0 :(得分:1)
不登录就对lambda函数进行故障排除有点像在黑暗中寻找东西:这非常困难。您将需要在客户端和服务器端(也称为后端)进行日志记录,以便能够解决此问题。
对于后端日志记录,AWS为Lambda和API网关提供了Cloudwatch logs。
因此,要检查您的lambda的Cloudwatch日志,请进入您的Lambda所在区域的AWS控制台,然后进入Cloudwatch服务。然后选择侧面的日志。您应该看到一个以Lambda函数命名的日志组。单击此选项将为您显示被调用时为lambda收集的诊断信息(有关示例,请参见下图)。展开并折叠日志行条目。
一旦确认您已打开cloudwatch日志,请遵循以下策略:
从IOS客户端运行测试调用,并确认客户端上的输出成功。然后检查您的IOS测试的cloudwatch日志(针对API网关和Lambda函数),并记录成功情况。
接下来,使用上面的代码从Android运行第二个测试。在cloudwatch中查找两者之间的区别,这应该可以揭示细节,以帮助您解决Android通话中出现的问题。
如果Amplify并未为您的API网关或Lambda函数创建Cloudwatch日志,请按照here步骤进行设置。希望这可以帮助您找到解决方案。