更新Node.js中javascript函数内的外部变量
我正在开发NodeJS应用程序,遇到以下问题: 我正在使用node模块node rest client使用API发出rest请求。我使用模块为我提供的post方法。我需要获取json响应并将其写入单独的变量并返回它们 我在client.post方法之外定义了returnData变量。我需要在函数中更新这个returnData变量,该变量作为参数传递给client.post方法 但我这里有一个范围问题。虽然我尝试更新该函数中的returnData变量,但当执行从client.post函数返回时,我发现在本例中设置的值为null,但可能是调用client.post函数之前的任何值仍然存在于该变量中 我怎样才能很好地定义作用域,以便更新函数内部的外部变量,并将其作为参数传递给另一个函数?任何帮助都将不胜感激 以下是我的代码:更新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函数返回时,我
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我忘了删除那一行,不管怎样,数据都成功返回了,所以我想函数的目的已经实现了!