更新Node.js中javascript函数内的外部变量

时间:2014-11-03 09:29:11

标签: javascript node.js scope

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

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

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

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

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

以下是我的代码:

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

谢谢。

1 个答案:

答案 0 :(得分:-1)

.post是Async,你应该这样做,

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