【问题标题】:Google Datastore can't update an entityGoogle Datastore 无法更新实体
【发布时间】:2019-10-19 06:53:51
【问题描述】:

我在从 Google 数据存储区检索实体时遇到问题。这是我的代码:

    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 是另一个实体的字符串 ID,我想将其存储在名为 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); 给我一个任务对象,但它似乎是在数据存储上创建一个新实体:

我也收到此错误:

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

这表明该数组不受支持?

【问题讨论】:

  • 你能去掉解构赋值并在await之后显示(用console.logtask的值吗?
  • 用完整的错误更新了帖子。
  • “解构赋值”是什么意思?
  • 你能试试这个代码const task = await transaction.get(taskKey); 并显示console.log(task) 的输出吗?
  • 我确实尝试过。结果相同。会再去一次...

标签: node.js google-app-engine google-cloud-datastore


【解决方案1】:

这里的问题是 Datastore 支持两种 ID。

  • name= 开头的ID 是自定义ID。它们被视为字符串
  • id= 开头的 ID 是数字自动生成的 ID,被视为整数

当您尝试更新数据存储区中的值时,cloudDataStoreCurrentSession 被视为字符串。由于 Datastore 找不到具有该自定义名称的已创建实体键,因此它创建了它并添加了 name= 以指定它是自定义名称。因此,您必须将 cloudDataStoreCurrentSession 作为整数传递才能正确保存数据。

如果我理解正确,您正在尝试使用特定的实体类型和实体键从数据存储区加载字符串数组列表。然后再添加一个任务并更新特定实体类型和实体键的数据存储区的值。

我创建了与您相同的案例场景,并自己编写了一些代码。在this GitHub code 中,您会发现我的示例执行以下操作:

  1. 转到数据存储实体类型会话
  2. 从 Entity Key id=5639456635748352(例如)中检索所有数据。
  3. 从以下键获取数组列表:session_tasks
  4. 添加从函数参数传递的新任务。
  5. 对 Datastore 执行事务并更新值。

所有步骤都记录在代码中,并且有很多 cmets 准确地解释了代码的工作原理。 currentSessionID 也有两个示例。一种用于自定义名称,另一种用于自动生成的 ID。您可以测试代码以了解其用法并根据需要进行修改。

【讨论】:

  • 太棒了!谢谢。
  • 很高兴能帮到你
猜你喜欢
  • 2018-07-27
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多