以下是我的代码,它向主机 78.154.17.70 ,端口 8080 和路径 /csrftoken.json 的网络服务器发出http请求。
我使用request.get
从服务器获取数据。我可以按以下格式获取数据Json data
:
{
"apiVersion": "1.0",
"data": {
"csrf": "ajbgajbgjabbjbjbab"
}
}
我全局声明了两个变量var CSRFTokenValue;
和var respJson;
。在request.get
内,我使用以下变量:respJson
存储解析数据,CSRFTokenValue
存储
“csrf”:“ajbgajbgjabbjbjbab”令牌值为“ajbgajbgjabbjbjbab”
表示CSRFTokenValue
会在其中存储“ajbgajbgjabbjbjbab”。
现在,当我在CSRFTokenValue
内记录request.get
时,它会给我“ajbgajbgjabbjbjbab”,但当我在外面登录时,它会给我 undefined 。
我需要在CSRFTokenValue
内的quesryString中使用request.post
来发布数据。
我不知道如何全局获取tokenValue?
var request = require('request');
var CSRFTokenValue;
var respJson;
request.get('http://78.154.17.70:8080/csrftoken.json', function (e, res, body){
respJson = JSON.parse(body);
CSRFTokenValue = respJson.data.csrf;
console.log('GET success:' + CSRFTokenValue);
});
console.log('GET token Globaly:' + CSRFTokenValue);
request.post('http://78.154.17.70:8080/Login/post.json?_csrf=' + CSRFTokenValue, {
'name' : 'name',
'password' : 'pass'
}, function (res) {
console.log('success');
});
答案 0 :(得分:3)
这是因为当你提出初始请求时,它是异步完成的。当您的请求在后台完成时,程序会直接移动到控制流中的下一个语句。请求完成后,CSRFTokenValue
将被设置,但您在请求完成之前打印出值,因此它是undefined
。
试试这个。
var request = require('request');
request.get('http://78.154.17.70:8080/csrftoken.json', function (e, res, body){
var respJson = JSON.parse(body);
var CSRFTokenValue = respJson.data.csrf;
console.log('GET success:' + CSRFTokenValue);
request.post('http://78.154.17.70:8080/Login/post.json?_csrf=' + CSRFTokenValue, {
'name' : 'name',
'password' : 'pass'
}, function (res) {
console.log('success');
});
});
一旦你从第一个请求获得了令牌,这将是你的第二个请求。
另外,请查看asynchronous programming。
答案 1 :(得分:0)
这条线,
console.log('GET token Globaly:' + CSRFTokenValue);
将立即执行,绕过您的异步调用request.get('http://78.154.17.70:8080/csrftoken.json'...
。这就是CSRFTokenValue未定义的原因,因为在声明中,您没有使用值启动它。
使用承诺来运行request.post('http://78.154.17.70:8080/Login/post.json?_csrf='...
。当AJAX调用成功时,只需在request.get中运行它。