简体   繁体   中英

How do i get return value when i call this functions?

I need to create a nodejs, for the following tasks:

1) Get my public IP address.
2) Update my public IP Address on my freenom.com account, for my registered domain.

I have two script working separetly.

1) Getting my public IP (npm install request):

'use strict';
var request = require('request');
request('http://api.ipify.org', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log(body);
  }
  else {
    console.log("Error "+response.statusCode);
  }
})

// This print my public IP correctly

2) Updating my IP in freenom account (npm install -g freenom-dns):

'use strict';
var user = "my@user_email.com";
var pass = "mypass";
var freenom = require("freenom-dns").init(user, pass);
freenom.dns.setRecord("myregistereddomain.com", "A", "12.12.12.12" , 3600)
                  .then(function(ret) {
                              console.log(ret)
                      })
                  .catch((err) => {
                      console.log(err);
                  });

// This update my new public IP on my freenom account as 12.12.12.12 correctly

I tried to declare a global var, and tried pass it the "body" function return, on my first script (get public IP), for after this, call my second script, passing "My_IP" var :

'use strict';

var My_IP = ""
var user = "my@user_email.com";
var pass = "mypass";

var freenom = require("freenom-dns").init(user, pass);
var request = require('request');

request('http://api.ipify.org', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log(body);
    My_IP = body;
  }
  else {
    console.log("Error "+response.statusCode);
  }
})

freenom.dns.setRecord("myregistereddomain.com", "A", My_IP , 3600)
                  .then(function(ret) {
                              console.log(ret)
                      })
                  .catch((err) => {
                      console.log(err);
                  });

But the type of My_IP is not a String variable. The update public IP function, only allow string value as arguments. How can i get the "body" value, when i call this function?

It seems to My_IP is string variable. just value is empty

You should check order of execution. request() is asynchronous task
It will be returns data through callback function

This is order of execution

My_IP = ''
request(..., callback)
freenom.dns.setRecord(..., My_IP) // My_IP is still empty
callback() // My_IP is update here

You can implement like this (or using Promise, Async function, etc..)

request('http://api.ipify.org', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log(body);
    My_IP = body;
    handler() // After My_IP was updated
  }
  else {
    console.log("Error "+response.statusCode);
  }
})

function handler () {
  freenom.dns.setRecord("myregistereddomain.com", "A", My_IP , 3600)
    .then(function(ret) {
      console.log(ret)
    })
    .catch((err) => {
      console.log(err);
    });
}

IMO it looks like request returns promise and setRecord is called before request gets response try that:

'use strict';
const freenom = require("freenom-dns").init(user, pass);
const request = require('request');

let My_IP = "";
let user = "my@user_email.com";
let pass = "mypass";

const createRequest = () => {
    request('http://api.ipify.org', function (error, response, body) {
        if (!error && response.statusCode == 200) {
            console.log(body);
            My_IP = body;
            setDns();
        }
        else {
            console.log("Error "+response.statusCode);
        }
    })
};

const setDns = () => {
    freenom.dns.setRecord("myregistereddomain.com", "A", My_IP , 3600)
        .then(function(ret) {
            console.log(ret)
        })
        .catch((err) => {
            console.log(err);
        });
};

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM