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

更新Node.js中javascript函数内的外部变量,javascript,node.js,scope,Javascript,Node.js,Scope,我正在开发NodeJS应用程序,遇到以下问题: 我正在使用node模块node rest client使用API发出rest请求。我使用模块为我提供的post方法。我需要获取json响应并将其写入单独的变量并返回它们 我在client.post方法之外定义了returnData变量。我需要在函数中更新这个returnData变量,该变量作为参数传递给client.post方法 但我这里有一个范围问题。虽然我尝试更新该函数中的returnData变量,但当执行从client.post函数返回时,我

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

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

我在client.post方法之外定义了returnData变量。我需要在函数中更新这个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;
}
谢谢。

.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

您仍在尝试从异步函数返回的可能的副本。使用回调函数。我哪里出错了?IMO如果……否则在此上下文中是同步的:/回调以return语句return{login:returnData}结束;但是返回的数据在回调之外的任何地方都无法访问。@RaphaelSerota我忘了删除那一行,不管怎样,数据都成功返回了,所以我想函数的目的已经实现了!