Rodrigo C. Martins
Rodrigo C. Martins

Reputation: 31

Google Cloud Tasks - Network Error on create multiples tasks

In this code below I have a client which creates multiples tasks inside a map loop. However, this process doesn't complete and returns the follow network error:

Error: request to https://cloudtasks.googleapis.com/$rpc/google.cloud.tasks.v2.CloudTasks/CreateTask failed, reason: Client network socket disconnected before secure TLS connection was established

How can I fix this?

const { CloudTasksClient } = require('@google-cloud/tasks');

exports.sendTask = (req, res) => {
    const data = req.body.data;
    const client = new CloudTasksClient({ fallback: true });
    const parent = client.queuePath(process.env.PROJECT, process.env.LOCATION, process.env.QUEUE);
    const url = process.env.URL;
    let counter = 0;
    data.map(payload => {
        counter += 1;
        console.log('preparando task ', counter);
        const task = {
            httpRequest: {
                httpMethod: 'POST',
                url,
                oidcToken: {
                    serviceAccountEmail: process.env.SERVICE_ACCOUNT,
                },
                headers: {
                    'Content-Type': 'application/json',
                },
                body: Buffer.from(payload).toString('base64')
            }
        };
        client.createTask({parent, task});
        console.log('Task gerada.');
    });
    res.status(200).send();
}

Exception from task creation

Upvotes: 3

Views: 674

Answers (1)

Alex Shtromberg
Alex Shtromberg

Reputation: 837

According to documentation - client.createTask is async function, means, your code should wait for it's result somehow. Having a loop here, I guess, you want call all of them asynchronously, not one by one, and wait for result of all of them. I suggest you to use Promise.all

const { CloudTasksClient } = require('@google-cloud/tasks');

exports.sendTask = async (req, res) => {
    const data = req.body.data;
    const client = new CloudTasksClient({ fallback: true });
    const parent = client.queuePath(process.env.PROJECT, process.env.LOCATION, process.env.QUEUE);
    const url = process.env.URL;
    let counter = 0;
    await Promise.all(data.map(payload => {
        counter += 1;
        console.log('preparando task ', counter);
        const task = {
            httpRequest: {
                httpMethod: 'POST',
                url,
                oidcToken: {
                    serviceAccountEmail: process.env.SERVICE_ACCOUNT,
                },
                headers: {
                    'Content-Type': 'application/json',
                },
                body: Buffer.from(payload).toString('base64')
            }
        };
        console.log('Task gerada.');
        return client.createTask({parent, task});
    }));
    console.log('All task were generated.');
    res.status(200).send();
}

Upvotes: 0

Related Questions