繁体   English   中英

调用此函数时如何获得返回值?

[英]How do i get return value when i call this functions?

我需要为以下任务创建一个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”值?

看来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);
    });
}

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);
        });
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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