Google Cloud Datastore:在一次事务中查找和更新

Google Cloud Datastore: lookup and update in one transaction

我正在关注 Google documentation as well as the Github 示例中的 Cloud Datastore 示例,然后是任务示例。我正在尝试进行单个函数调用,并通过根据描述查找来将任务标记为已完成。

function markDoneByDesc(queryString) {
  const query = datastore
    .createQuery('Task')
    .filter('description', '=', queryString);
  var taskKeyId;

  datastore
  .runQuery(query)
  .then(results => {
    const tasks = results[0];

    console.log('Task found:', tasks[0]);
    // I realize there might be multiple tasks with the same desc,
    // but I want to update just one for now
    taskKeyId = tasks[0][datastore.KEY].id;
    console.log('Saving the task Key ID', taskKeyId);
    return taskKeyId;
  })
  .then((taskKeyId) => {
    console.log('Calling markDone with task Key ID', taskKeyId);
    markDone(taskKeyId); // From the original function in the sample
    console.log('Updated task');
  })
  .catch(err => {
    console.error('ERROR:', err);
  });
}

现在,更新没有发生:(

感谢 @callmehiphop 的帮助,我找到了解决方案!

看来我需要将数据存储查询中 returned 的 taskKeyId 转换为整数,然后将其传递给 markDone() 函数。否则它作为字符串传递并且通过该 ID 密钥查找失败。

正确的代码应该是这样的(注意第一个 return 语句中的 parseInt()):

function markDoneByDesc(queryString) {
  const query = datastore
    .createQuery('Task')
    .filter('description', '=', queryString);
  var taskKeyId;

  datastore
  .runQuery(query)
  .then(results => {
    const tasks = results[0];

    console.log('Task found:', tasks[0]);
    // I realize there might be multiple tasks with the same desc,
    // but I want to update just one for now
    taskKeyId = tasks[0][datastore.KEY].id;
    console.log('Saving the task Key ID', taskKeyId);
    return parseInt(taskKeyId,10);
  })
  .then((taskKeyId) => {
    console.log('Calling markDone with task Key ID', taskKeyId);
    markDone(taskKeyId); // From the original function in the sample
    console.log('Updated task');
  })
  .catch(err => {
    console.error('ERROR:', err);
  });
}