我在从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
给我一个任务对象,但它似乎正在数据存储区上创建一个新实体:
我也收到此错误:
const task = await transaction.get(taskKey).catch(console.error);
这表明该阵列不受支持吗?
答案 0 :(得分:2)
这里的问题是数据存储区支持两种ID。
name=
开头的id=
开头的ID是数字自动生成的ID,被视为整数当您尝试更新数据存储区中的值时, cloudDataStoreCurrentSession 被视为字符串。由于数据存储区找不到具有该自定义名称的已创建实体键,因此它创建了它并添加了name=
以指定它是一个自定义名称。因此,您必须将 cloudDataStoreCurrentSession 作为整数传递,以正确保存数据。
如果我理解正确,则您正在尝试使用特定的Entity Kind和Entity Key从数据存储区加载字符串数组列表。然后再添加一个任务,并更新特定实体类型和实体密钥的数据存储区的值。
我创建了与您相同的案例,并做了一些自己的编码。在this GitHub code中,您将找到执行以下操作的示例:
所有步骤都记录在代码中,并且有很多注释解释了代码的工作原理。还有两个 currentSessionID 的示例。一种用于自定义名称,另一种用于自动生成的ID。您可以测试代码以了解其用法并根据需要对其进行修改。