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未找到:未找到请求的实体
,因为最初的问题现已解决,我建议您使用更新的代码和新出现的错误打开一个新问题。我认为您很可能正在尝试删除队列中不再挂起的任务(如果任务已成功执行或永久失败,则无法删除该任务)。因此,您需要更改代码以尝试删除该任务,但如果失败,则只需正常继续,而不是崩溃。