2

I'm using Node https library to send data to Facebook API. I end up with error:

getaddrinfo ENOTFOUND https://graph.facebook.com/ https://graph.facebook.com/:443

I find it weird, because the same request made with Postman goes through without any problem.

I tried nslookup:

$ nslookup https://graph.facebook.com/
Server:     1.1.1.1
Address:    1.1.1.1#53

** server can't find https://graph.facebook.com/: NXDOMAIN

Not sure what causes this.

This is my code with anonymized tokens:

var inputData = new Array;
inputData.firstname = "First name";
inputData.lastname = "Last name"
inputData.phone = "Phone";
inputData.email = "Email";
inputData.workable_stage = "Applied";

inputData.access_token = 'xxx';

var https = require('https');
var crypto = require('crypto'); // Facebook API requires hashing of user data
var querystring = require('querystring');

const firstname_hash = crypto.createHash('sha256');
const lastname_hash = crypto.createHash('sha256');
const phone_hash = crypto.createHash('sha256');
const email_hash = crypto.createHash('sha256');

// hash user data
firstname_hash.update(inputData.firstname);
var firstname_hashed = firstname_hash.digest('hex');

lastname_hash.update(inputData.lastname);
var lastname_hashed = lastname_hash.digest('hex');

phone_hash.update(inputData.phone);
var phone_hashed = phone_hash.digest('hex');

email_hash.update(inputData.email);
var email_hashed = email_hash.digest('hex');

// prepare data object

var fb_data = [
  { match_keys: 
         {
           "fn": firstname_hashed,
           "ln": lastname_hashed,
           "phone": phone_hashed,
           "email": email_hashed
         }, 
   event_name: "Lead",
   event_time: Date.now() / 1000 | 0, // UNIX timestamp in seconds, see: https://stackoverflow.com/a/221297/6178132
   custom_data: {
     workable_stage: inputData.workable_stage,
   }
  }
]

body = {
  access_token: inputData.access_token,
  upload_tag: "store_data",
  data: fb_data
}

console.log(querystring.stringify(body));

var postData = querystring.stringify(body);

// send http request
const options = {
  hostname: 'https://graph.facebook.com/',
  port: 443,
  path: '/v3.3/123/events',
  method: 'POST',
  headers: {
    'Content-Type': 'multipart/form-data',
    'Content-Length': Buffer.byteLength(postData)
  }
};

const req = https.request(options, (res) => {
  console.log(`STATUS: ${res.statusCode}`);
  console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
  res.setEncoding('utf8');
  res.on('data', (chunk) => {
    console.log(`BODY: ${chunk}`);
  });
  res.on('end', () => {
    console.log('No more data in response.');
  });
});

req.on('error', (e) => {
  console.error(`problem with request: ${e.message}`);
});

// Write data to request body
req.write(postData);
req.end();
Patryk
  • 197
  • 1
  • 16
  • I get the same error when running this script through Zapier, so it's definitely not my machine – Patryk Jul 24 '19 at 08:21

1 Answers1

3

If you change your options like so the request should work, the hostname parameter is the only one that needs updating:

const options = {
    hostname: 'graph.facebook.com',
    port: 443,
    path: '/v3.3/123/events',
    method: 'POST',
    headers: {
    'Content-Type': 'multipart/form-data',
    'Content-Length': Buffer.byteLength(postData)
    }
};
Terry Lennox
  • 29,471
  • 5
  • 28
  • 40