我正试图通过云功能删除谷歌云任务。这是我认为我需要的基于谷歌文档的代码。
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。。。是我试图删除的taskID吗?所以我的问题是,我是否没有向谷歌任务提供足够的信息来删除我遇到PERMISSION_DENIED错误的任务?此外,如果有更多信息,我应该提供相应的字段名称,因为从我在谷歌文档中看到的deleteTask只取"name"。如有任何建议,不胜感激。
我真的很感激所有的帮助,所以现在我的代码看起来是这样的。
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}`);
});
它工作得很好,这很好,谢谢你,尽管,我仍然在这个捕获方法中遇到错误
5 NOT_FOUND: Requested entity was not found
我已经测试了好几次,结果一致。如果我担心的话,它似乎确实像预期的一样工作
对于权限问题,您需要在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";
}
您需要为云功能服务帐户分配必要的权限才能删除任务。假设您使用默认的PROJECT_ID@appspot.gserviceaccount.com as
服务帐户运行云功能,只需将Cloud Tasks Task Deleter (Access to delete tasks)
角色授予该服务帐户即可。
将角色授予服务帐户