0

⚠️ I forgot a process.exit(0) in the main thread, so the app was terminated before the callback was executed. This code sample works like a charm.


Here is the code from googleapis nodejs client I have issue on:

First thing first, I would like to get the list of contacts for one user using a nodejs application.

Set up a OAuth2Client

So I set up a OAuth2Client with this code:

const {
  client_id: CLIENT_ID,
  client_secret: CLIENT_SECRET
} = require("./keys.json");
const REDIRECT_URL = "http://localhost:3000/oauth2callback";
const oAuth2Client = new OAuth2Client(CLIENT_ID, CLIENT_SECRET, REDIRECT_URL);

Then, using a temporary server, I ask for token using the user's credentials:

function getGoogleCode() {
  return new Promise((resolve, reject) => {
    // Open an http server to accept the oauth callback. In this simple example, the
    // only request to our webserver is to /oauth2callback?code=<code>
    const server = http
      .createServer(async (req, res) => {
        if (req.url.indexOf("/oauth2callback") > -1) {
          // acquire the code from the querystring, and close the web server.
          const { code } = querystring.parse(url.parse(req.url).query);
          res.end(
            `Authentication successful! Please return to the console. [code: ${code}]`
          );
          server.close();
          resolve(code);
        }

        reject(new Error("oops", req, res));
      })
      .listen(3000, () => {
        // open the browser to the authorize url to start the workflow
        // Generate the url that will be used for the consent dialog.
        const authorizeUrl = oAuth2Client.generateAuthUrl({
          access_type: "offline",
          scope: ["https://www.googleapis.com/auth/contacts.readonly"]
        });
        opn(authorizeUrl);
      });
  });
}

Then I finish to set up my client:

const code = await getGoogleCode();
const { tokens } = await oAuth2Client.getToken(code);
oAuth2Client.setCredentials(tokens);

When everything's fine

I managed to get a response with the low level API:

const personFields = ["emailAddresses", "names"];
const url = `https://people.googleapis.com/v1/people/me/connections?personFields=${personFields.join(
  ","
)}`;
const res = await oAuth2Client.request({ url });
console.log(chalk.gray(JSON.stringify(res.data.connections, null, 2)));

Everything is working like a charm, but, I would like to use the high level API from the same library

google.people API

As described in API Explorer, I build the code below:

const personFields = ["emailAddresses", "names"];
people.people.connections.list(
  { resourceName: "people/me", personFields },
  (res, err) => {
    console.log("error: ", err);
    console.log("res1: ", res);
  }
);

No error, no res1, nothing.


⚠️ I forgot a process.exit(0) in the main thread, so the app was terminated before the callback was executed. This code sample works like a charm.

enguerran
  • 3,193
  • 3
  • 26
  • 42

1 Answers1

0

Not sure why you aren't getting logging. But you probably should return the res in the callback, otherwise calling await on the callback will return undefined.

Also make sure to set personFields in the people.people.connections.list call.

Amos Yuen
  • 1,420
  • 1
  • 9
  • 19
  • My mistake, I removed the `async/await` instructions (that was just a try to add them). And it does not work anyway. The callback is never called and `res2` is always `undefined` and no error are displayed. Even with the `personFields` set. – enguerran Mar 16 '18 at 08:18
  • I am an ~~idiot~~ tired developer, the callback was working, but the process was closed too soon because of a `process.exit(0)` called in the main thread. – enguerran Mar 16 '18 at 10:27