React Native, AWS, Error только на Android "Ошибка типа: невозможно прочитать свойство 'handle' of null" - PullRequest
0 голосов
/ 27 ноября 2018

Я сталкивался с ошибкой, когда запускал свое приложение React Native на устройстве Android (физическом и в эмуляторе).Тем не менее, никаких проблем на iOS.Эти функции должны сканировать таблицу базы данных на предмет пользовательских дескрипторов и возвращать объект, если дескриптор уже существует.

Вот как выглядит ошибка:

TypeError: Cannot read property 'handle' of null
at exports.handler (/var/task/index.js:7:36)

Я использую React Native, AWS Lambda и EXPO.

Этот код находится в пределах dbfunctions.js на внешнем интерфейсе.

export async function scanHandles(){
  return new Promise((resolve, reject) => {
    let { auth } = store.getState()


    let reqBody = {
      userId: auth.user.username,
      handle: auth.handle_update,
    }

    let path = '/u/scan-handle'
    let myInit = {
      headers: { 'Content-Type': 'application/json' },
      body: reqBody,
    }

    console.log('myInit', myInit)
    console.log('handle', auth.handle_update)

    API.get(apiName, path, myInit)

      .then((resp) => {
        // if false, then handle does not exist
        // if true, then handle already exists
        resolve(resp)
      })
      .catch((error) => {
        console.warn('Scan Handle', error)
        reject(error)
      })
  })
}

Ведение журнала консоли auth.handle_update выводит ожидаемую строку.myInit также распечатывает ожидаемый объект.

На заднем конце я использую это для сканирования:

const AWS = require("aws-sdk");
const docClient = new AWS.DynamoDB.DocumentClient({ region: "us-west-1" });

exports.handler = (event, context, callback) => {
  let e = JSON.parse(event.body);

  var params = {
    TableName: event.stageVariables.user,
    FilterExpression: "handle = :handle",
    ExpressionAttributeValues: { ":handle": e.handle }
  };

  docClient.scan(params, function(err, data) {

    if (err) {
      console.log("ERROR:", err);
      let response = {
        statusCode: err.statusCode,
        headers: {},
        body: JSON.stringify(err)
      };
      callback(response);
    }
    if (data.Count >= 1) {
      // if user name exists
      // call back handle exists response

      let handleExistsResponse = {
        statusCode: 200,
        body: JSON.stringify({ Success: true })
      };
      callback(null, handleExistsResponse);
    } else {
      let response = {
        statusCode: 200,
        body: JSON.stringify({ Success: false })
      };
      callback(null, response);
    }
  });
};

Любая идея о том, почему это будет работать на iOS ине Android?

РЕДАКТИРОВАТЬ:

При дальнейшем тестировании let e = JSON.parse(event.body) возвращает null.Итак, я вошел в консоль event и получил большой старый объект.В этом объекте я нашел body, а он все еще null.Таким образом, объект тела не проходит его должным образом.Все еще не понимает, работает ли она на iOS, а не на Android.

1 Ответ

0 голосов
/ 27 ноября 2018

Сделал это!Хорошо, поэтому API.get не нравится, когда тело передается. Вместо этого ему нужен параметр запроса.Таким образом, лямбда-параметры выглядят так:

 var params = {
    TableName: event.stageVariables.user,
    FilterExpression: "handle = :handle",
    ExpressionAttributeValues: { 
      ":handle": event["queryStringParameters"]["handle"]
    }
  };

А функция внешнего интерфейса:

export async function scanHandles(){
  return new Promise((resolve, reject) => {
    let { auth } = store.getState()
    let handle = auth.handle_update

    let path = `/u/scan-handle?handle=${handle}`
    let myInit = {
      headers: { 'Content-Type': 'application/json' },
    }

    API.get(apiName, path, myInit)

      .then((resp) => {
        // if false, then handle does not exist
        // if true, then handle already exists
        resolve(resp)
      })
      .catch((error) => {
        console.warn('Scan Handle', error)
        reject(error)
      })
  })
}

Работает как на iOS, так и на Android.Интересно, почему это не работало раньше?

...