Google Datastore не может обновить сущность - PullRequest
1 голос
/ 03 июня 2019

У меня проблемы с получением объекта из Google Datastore.Вот мой код:

    async function pushTaskIdToCurrentSession(taskId){

    console.log(`Attempting to add ${taskId} to current Session: ${cloudDataStoreCurrentSession}`);

    const transaction = datastore.transaction();
    const taskKey = datastore.key(['Session', cloudDataStoreCurrentSession]);

    try {
      await transaction.run();

      const [task] = await transaction.get(taskKey);
      let sessionTasks = task.session_tasks;
      sessionTasks.push(taskId);
      task.session_tasks = sessionTasks;

      transaction.save({
        key: taskKey,
        data: task,
      });
      transaction.commit();
      console.log(`Task ${taskId} added to current Session successfully.`);

    } catch (err) {
        console.error('ERROR:', err);
        transaction.rollback();
    }
}

taskId - это строковый идентификатор другого объекта, который я хочу сохранить в массиве свойства с именем session_tasks.

Но это не такполучить это далеко.После этой строки:

const [task] = await transaction.get(taskKey);

Ошибка в том, что task не определено: ERROR: TypeError: Cannot read property 'session_tasks' of undefined at pushTaskIdToCurrentSession

Что-нибудь сразу очевидное из этого кода?

ОБНОВЛЕНИЕ:

Использование этого вместо: const task = await transaction.get(taskKey).catch(console.error); Получает мне объект задачи, но, похоже, создает новую сущность в хранилище данных: datastore entity error

Я также получаю эту ошибку:

(node:19936) UnhandledPromiseRejectionWarning: Error: Unsupported field value, undefined, was provided. at Object.encodeValue (/Users/.../node_modules/@google-cloud/datastore/build/src/entity.js:387:15)

Это говорит о том, что массив не поддерживается?

1 Ответ

2 голосов
/ 07 июня 2019

Проблема в том, что Datastore поддерживает два вида идентификаторов.

  • идентификаторы, начинающиеся с name=, являются пользовательскими идентификаторами. И они рассматриваются как строки
  • Идентификаторы, которые начинаются с id=, являются числовыми автоматически генерируемыми идентификаторами и обрабатываются как целые числа

Когда вы пытались обновить значение в хранилище данных, cloudDataStoreCurrentSession обрабатывалось как строка. Поскольку Datastore не смог найти уже созданный ключ сущности с этим пользовательским именем, он создал его и добавил name=, чтобы указать, что это пользовательское имя. Таким образом, вы должны передать cloudDataStoreCurrentSession как целое число, чтобы правильно сохранить данные.

Если я правильно понимаю, вы пытаетесь загрузить список строк массива из хранилища данных, используя определенный вид сущности и ключ сущности. Затем вы добавляете еще одну задачу и обновляете значение хранилища данных для определенного вида и ключа объекта.

Я создал тот же сценарий, что и ваш, и сам немного программировал. В этом коде GitHub вы найдете мой пример, который делает следующее:

  1. Переходит к типу сущности хранилища данных Сессия .
  2. Извлекает все данные из ключа объекта id = 5639456635748352 (например,).
  3. Получить список массивов из ключа: session_tasks .
  4. Добавляет новую задачу, переданную из аргументов функции.
  5. Выполняет транзакцию для хранилища данных и обновляет значения.

Все шаги регистрируются в коде, и есть много комментариев, объясняющих, как именно работает код. Также есть два примера currentSessionID . Один для пользовательских имен и другой для автоматически сгенерированных идентификаторов. Вы можете проверить код, чтобы понять его использование и изменить его в соответствии с вашими потребностями.

...