我需要为以下任务创建一个nodejs:
1) Get my public IP address. 2) Update my public IP Address on my freenom.com account, for my registered domain.
我有两个脚本分开工作。
1)获取我的公共IP(npm安装请求):
'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)更新我在freenom帐户中的IP(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
我尝试声明一个全局变量,并尝试在我的第一个脚本(获取公共IP)上将其传递给“ body”函数返回,因为在此之后,请调用第二个脚本,并传递“ 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);
});
但是My_IP的类型不是String变量。更新公共IP功能,仅允许将字符串值用作参数。调用此函数时,如何获得“ body”值?
答案 0 :(得分:0)
My_IP
似乎是字符串变量。正义值是空的
您应检查执行顺序。 request()
是异步任务
将通过回调函数返回数据
这是执行顺序
My_IP = ''
request(..., callback)
freenom.dns.setRecord(..., My_IP) // My_IP is still empty
callback() // My_IP is update here
您可以这样实现(或使用Promise,Async函数等。)
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);
});
}
答案 1 :(得分:0)
IMO看起来请求返回了Promise,并在请求获得响应之前调用setRecord尝试:
'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);
});
};