Google数据存储区无法更新实体

时间:2019-06-03 17:35:09

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

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

@echo off
set SourceDir=%~dp0\SourceFolder
set TargetDir=%~dp0\Targetfolder
set MaxFiles=100
for /f "tokens=1* delims=[]" %%G in ('dir /A-D /B "%SourceDir%\*.*" ^|
find /v /n ""') do (
move "%SourceDir%\%%~nxH" "%TargetDir%\"
if %%G==%MaxFiles% exit /b 0)

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 给我一个任务对象,但它似乎正在数据存储区上创建一个新实体: datastore entity error

我也收到此错误:

const task = await transaction.get(taskKey).catch(console.error);

这表明该阵列不受支持吗?

1 个答案:

答案 0 :(得分:2)

这里的问题是数据存储区支持两种ID。

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

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

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

我创建了与您相同的案例,并做了一些自己的编码。在this GitHub code中,您将找到执行以下操作的示例:

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

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