【问题标题】:Updating outside variables inside a javascript function in Node.js在 Node.js 的 javascript 函数中更新外部变量
【发布时间】:2014-11-03 09:29:11
【问题描述】:

我正在开发一个 NodeJS 应用程序并遇到以下问题:

我正在使用节点模块node-rest-client 通过 API 发出 REST 请求。我使用模块提供的post 方法来实现我的目的。我需要获取 json 响应并将其写入单独的变量并返回它们。

我在client.post 方法之外定义了returnData 变量。我需要在作为参数传递给client.post 方法的函数中更新这个returnData 变量。

但我这里有一个范围问题。尽管我尝试更新该函数内的returnData 变量,但当执行从client.post 函数返回时,我看到我在调用client.post 函数之前设置的相同值(在本例中为null,但可能是任何值)仍然存在于变量中。

我怎样才能很好地定义范围,以便我可以更新作为参数传递给另一个函数的函数内部的外部变量?任何帮助将不胜感激。

以下是我的代码:

module.exports = function(){
    require("../config");
    var restClient = require('node-rest-client').Client;
    var client = new restClient();
    var sessionID = null,
        reqID = 1;

    var login = function(username, password){
        var requestParams = {};
        var apiParams = {};

        requestParams.jsonrpc = "2.0";
        requestParams.method = ZABBIX_API_METHODS.login;
        apiParams.user = username;
        apiParams.password = password;
        requestParams.params = apiParams;
        requestParams.id = reqID;
        requestParams.auth = null;

        var args = {
            data: requestParams,
            headers:{"Content-Type": "application/json-rpc"}    // ask response type to be application/json-rpc
        };

        var returnData = {};
        returnData.status = null;
        returnData.data = null

        client.post(ZABBIX_API, args, function(resData,rawRes){

            if(rawRes.statusCode == 200){
                returnData.status = rawRes.statusCode;
                returnData.data = resData;
            }
            else{
                returnData.status = rawRes.statusCode;
                returnData.data = "Request Failed!";
            }

            reqID = reqID + 1;
            console.log(returnData.data);

        });

        console.log("SessionID:"+getSessionID());

        return returnData;

    }    

    var functions = {
        login: login
    }

    return functions;
}

谢谢。

【问题讨论】:

标签: javascript node.js scope


【解决方案1】:

.post 是异步的,你应该这样做,

var login = function(username, password, callback){
..................

client.post(ZABBIX_API, args, function(resData,rawRes){

        if(rawRes.statusCode == 200){
            returnData.status = rawRes.statusCode;
            returnData.data = resData;
        }
        else{
            returnData.status = rawRes.statusCode;
            returnData.data = "Request Failed!";
        }

        reqID = reqID + 1;
        return {login: returnData};
    });
//remove all below return statements

【讨论】:

  • 您仍在尝试从异步函数返回。使用回调。
  • @BenFortune 我哪里出错了? IMO If...else are Sync 在这种情况下。 ://
  • 回调以 return 语句 (return {login: returnData};) 结束,但在回调之外的任何地方都无法访问返回的数据。
  • @RaphaelSerota 我忘了删除那行,反正数据成功返回了,所以我猜这个函数的目的已经实现了!
猜你喜欢
  • 1970-01-01
  • 2021-03-16
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
相关资源
最近更新 更多