【问题标题】:How do i get return value when i call this functions?调用此函数时如何获取返回值?
【发布时间】:2020-01-12 19:23:33
【问题描述】:

我需要创建一个nodejs,用于以下任务:

1) 获取我的公共 IP 地址。 2) 在我的 freenom.com 帐户上更新我注册域的公共 IP 地址。

我有两个单独工作的脚本。

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”变量:

'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”值?

【问题讨论】:

  • consolebody 看起来像什么?如果不是字符串,MY_IP 的类型是什么?
  • 你不能使用toString() 将值转换为字符串吗?
  • 使用bodyparser
  • 你只需要使用回调函数中的值。从那里继续使用它的逻辑。回调在很长一段时间后被调用,在之后的代码已经执行很久之后。因此,ip 地址唯一有效的地方是回调函数中第一次可用的地方。
  • 也许这有帮助:felix-kling.de/blog/2019/…

标签: javascript node.js request ip


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    IMO 看起来请求返回承诺并在请求得到响应之前调用 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);
            });
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 1970-01-01
      • 2018-06-25
      • 1970-01-01
      • 2017-11-05
      • 1970-01-01
      相关资源
      最近更新 更多