1

I am using node js to get all contact data from Google API. USing callback function but it takes some time to get data due to run function before next function. I am very new in node JS can someone help me to sort it out. I want all data return once the callback function is called.

A contact function to get all contacts.

app.get('/contacts', async function(req, res){
  
  // Rendering our web page i.e. Demo.ejs
  // and passing title variable through it
    fs.readFile('credentials.json', (err, content) => {
    if (err) return console.log('Error loading client secret file:', err);
    // Authorize a client with credentials, then call the Google Tasks API.
     await  authorize(JSON.parse(content), listConnectionNames);
     res.send(full_person_array)
  });
  

})

This one is autorize function that callback listConnectionNames fucntion.

function authorize(credentials, callback) {

  return new Promise((resolve, reject) => {
    const {client_secret, client_id, redirect_uris} = credentials.installed;
    const oAuth2Client = new google.auth.OAuth2(
        client_id, client_secret, redirect_uris[0]);
  
    // Check if we have previously stored a token.
    fs.readFile(TOKEN_PATH, (err, token) => {
      if (err) return getNewToken(oAuth2Client, callback);
      oAuth2Client.setCredentials(JSON.parse(token));
      callback(oAuth2Client, id);
      return resolve();

    });

  })
 
}


function listConnectionNames(auth) {
  const service = google.people({version: 'v1', auth});
  service.people.connections.list({
    resourceName: 'people/me',
    pageSize: 50,
    personFields: 'names,emailAddresses,phoneNumbers',
  }, (err, res) => {
    if (err) return console.error('The API returned an error: ' + err);
    const connections = res.data.connections;
    if (connections) {
      console.log('Connections:');
      connections.forEach((person) => {
        console.log(person);
        full_person_array.push(person);
      });
    } else {
      console.log('No connections found.');
    }
  });
}

How to get all data in contact without get delayed empty data.

1 Answer 1

0

You can add returns instead of mapping the result array to fill an other array :

function authorize(credentials) {

    const {
        client_secret,
        client_id,
        redirect_uris
    } = credentials.installed;
    const oAuth2Client = new google.auth.OAuth2(
        client_id, client_secret, redirect_uris[0]);

    // Check if we have previously stored a token.
    return fs.readFile(TOKEN_PATH, (err, token) => {
        if (err) return getNewToken(oAuth2Client);
        oAuth2Client.setCredentials(JSON.parse(token));
        return oAuth2Client;

    });
}


async function contact() {
    let auth = await authorize(credentials);
    let connections = await listConnectionNames(auth, id);
    console.log(connections); // full result
}

Does it helps you ?

Sign up to request clarification or add additional context in comments.

12 Comments

For passing auth, I need to run an authorized function first. so in contact function it wait to get authorized i want to return data onlly once all data is come up
Yes and authorize is call in contacts function.
let connections = await listConnectionNames(auth, test); ^^^^^ SyntaxError: await is only valid in async functions and the top level bodies of modules
Getting Error posted abobe.
Well, you can delete this line, it's no more used as you call listConnectionNames as a callback inside authorize
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.