0

我正在尝试通过云功能删除 Google 云任务。这是我认为我需要基于谷歌文档的代码。

export const deleteHearingReminder = functions.firestore
  .document('Hearings/{HearingID}/Accepted/{AcceptedId}')
  .onUpdate(async change => {
    const dataBefore = change.before.data() as data;
    const dataAfter = change.before.data() as data;

    if (dataBefore === dataAfter) {
      console.log("Text didn't change");
      return null;
    }

    const taskID ={ name : dataAfter.taskId };

    const client = new CloudTasksClient();

    const [response] = await client.deleteTask(taskID);

    console.log(`delete task ${response.name}`);

    return Promise.resolve({ task: response.name });
  });

当这个函数被调用时,我得到一个错误

Error: 7 PERMISSION_DENIED: Permission denied on resource project 6cDNgaqLniz6kHGonePh.

其中 6cDN... 是我要删除的任务 ID,所以我的问题是我没有为谷歌任务提供足够的信息来删除我收到 PERMISSION_DENIED 错误的任务吗?此外,如果有更多信息,我应该提供相应的字段名称,因为从我在谷歌文档中看到的 deleteTask 只取“名称”。感谢您提出任何建议。

我真的很感谢所有的帮助,所以现在我的代码看起来像这样。

const request = {
        name: `projects/${project}/locations/${location}/queues/${default_queue}/tasks/${dataAfter.taskId}`,
    };
    taskClient.deleteTask(request).catch(error => {
        console.error(`There was an error ${error}`);
    });

它工作得很好,谢谢你,我仍然在这个 catch 方法中遇到错误

5 NOT_FOUND: Requested entity was not found

如果我担心这一点,我已经对其进行了多次测试,结果一致,它似乎确实按预期工作

4

2 回答 2

0

对于权限问题,您需要在 IAM 页面中为您的服务帐户使用角色 Cloud Tasks Delete

但是,您正试图错误地执行任务删除。

您可以在此处查看有关任务删除的官方文档。

尝试按照此处的示例进行操作,该示例显示了如何删除队列,而是删除您的任务

async function deleteQueue(
  project = 'my-project-id', // Your GCP Project id
  queue = 'my-appengine-queue', // Name of the Queue to delete
  location = 'us-central1' // The GCP region in which to delete the queue
) {
  // Imports the Google Cloud Tasks library.
  const cloudTasks = require('@google-cloud/tasks');

  // Instantiates a client.
  const client = new cloudTasks.CloudTasksClient();

  // Get the fully qualified path to the queue
  const name = client.queuePath(project, location, queue);

  // Send delete queue request.
  await client.deleteQueue({name});
  console.log(`Deleted queue '${queue}'.`);
}

const args = process.argv.slice(2);
deleteQueue(...args).catch(console.error);

您传递的参数需要是以下格式的任务名称:

name=projects/[PROJECT_ID]/locations/[LOCATION]/queues/[QUEUE]/tasks/[TASK]

在这里,您可以看到删除任务方法的工作原理以及它期望接收的内容。

  // Deletes a task.
  //
  // A task can be deleted if it is scheduled or dispatched. A task
  // cannot be deleted if it has completed successfully or permanently
  // failed.
  rpc DeleteTask(DeleteTaskRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v2beta2/{name=projects/*/locations/*/queues/*/tasks/*}"
    };
    option (google.api.method_signature) = "name";
  }
于 2020-03-03T10:39:40.633 回答
0

您需要为云功能服务帐户分配必要的权限才能删除任务。假设您使用默认PROJECT_ID@appspot.gserviceaccount.com as服务帐户运行云功能,只需将Cloud Tasks Task Deleter (Access to delete tasks)角色授予服务帐户即可。

向服务帐号授予角色

于 2020-03-02T23:32:07.573 回答