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.