Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从云函数中删除云任务_Javascript_Google Cloud Functions_Google Cloud Tasks - Fatal编程技术网

Javascript 从云函数中删除云任务

Javascript 从云函数中删除云任务,javascript,google-cloud-functions,google-cloud-tasks,Javascript,Google Cloud Functions,Google Cloud Tasks,我正试图通过云功能删除谷歌云任务。这是我认为我需要的基于谷歌文档的代码 export const deleteHearingReminder = functions.firestore .document('Hearings/{HearingID}/Accepted/{AcceptedId}') .onUpdate(async change => { const dataBefore = change.before.data() as data; const dat

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

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,所以我的问题是,我是否向google tasks提供了足够的信息来删除此任务,从而导致我获得了权限\u拒绝错误?此外,如果有更多的信息,我应该提供什么是相应的字段名称,因为从我在谷歌文档删除任务上看到的只有'名称'。谢谢你的建议

我真的很感谢所有的帮助,所以现在我的代码是这样的

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

我已经对它进行了多次测试,结果一致。如果我对此感到担忧,它似乎确实按照预期工作

您需要为云功能服务帐户分配必要的权限,以便删除该任务。假设您正在使用默认的
项目运行云函数_ID@appspot.gserviceaccount.com作为服务帐户,只需将
云任务任务删除器(删除任务的访问权)
角色授予服务帐户即可


对于权限问题,您需要在IAM页面中为您的服务帐户提供“云任务删除”角色

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

您可以看到关于任务删除的信息

尝试按照说明如何删除队列,而不是删除任务的

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]
您可以看到delete任务方法是如何工作的,以及它希望收到什么

  // 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";
  }

不幸的是,这并没有解决问题,尽管我确实阅读了你附上的谷歌文档,并看到这似乎是我正在寻找的解决方案,所以我不确定是什么错了。我是否可以提供任何其他信息来帮助您更好地理解问题。我在deleteTask的末尾添加了一个catch,并看到我在请求中也得到了一个
错误:3无效的参数:无效的资源字段值。
我想这与我如何将值传递给deleteTask有关。是否应将其作为http请求传递?谢谢,这确实解决了我的问题我在上面发布了更新的代码,它似乎工作正常任务被删除,但我仍然收到一个错误
5未找到:未找到请求的实体
,因为最初的问题现已解决,我建议您使用更新的代码和新出现的错误打开一个新问题。我认为您很可能正在尝试删除队列中不再挂起的任务(如果任务已成功执行或永久失败,则无法删除该任务)。因此,您需要更改代码以尝试删除该任务,但如果失败,则只需正常继续,而不是崩溃。