我无法弄清楚如何从node.js模块获取变量。我正在创建一个与身份验证机制接口的模块,目前它只返回一个令牌。我需要在main.js中使用此令牌,因为我将调用其他模块,并传递此令牌进行身份验证。
//auth.js
var request = require("request");
var authModule = {};
var authToken = "";
var options = {
method: 'POST',
url: 'https://dummy.url/oauth/token',
headers: {
'authorization': 'Basic secretkeystring',
'accept': 'application/json',
'content-type': 'application/x-www-form-urlencoded'
},
form: {
grant_type: 'password',
username: 'indegomontoya',
password: 'sixfingeredman'
}
};
authModule.getToken = function getToken(){
request(options, requestToken);
};
function requestToken (error, response, body) {
if (error) throw new Error(error);
authToken = response.body.toString().split('\n')[1].split(":")[1].split('"')[1];
console.log("auth.js says: " + authToken);
// ^^ this works, and spits out the correct token to the console
return authToken;
};
module.exports = authModule;
module.exports.token = authToken;
这是我的main.js:
//main.js
var auth = require("./auth.js");
var token;
token = auth.getToken();
console.log("main.js says :"+ token);
// ^^ comes back undefined
我见过从main.js向module.js发送变量的例子,但我需要做相反的事情。非常感谢任何帮助!
编辑:代码中的拼写错误。
答案 0 :(得分:2)
尝试传递哈希值。
module.exports = {
module: authModule,
token: authToken
}
var gcdm = require("./gcdm.js");
gcdm.module();
gcdm.token;
答案 1 :(得分:1)
request
模块(来自here)似乎是异步的,这意味着它可能需要任何时间来返回其数据。这意味着您可能需要在使用getToken
方法时使用回调。
目前,您的main.js
应用程序没有为auth.js
模块提供足够的时间来获取令牌数据。它请求令牌,然后在相同的呼吸(或处理器的滴答声)中,它尝试将其打印到控制台。要解决此问题,您需要使用回调。
我可能会调整你的两个auth模块方法,如下所示:
authModule.getToken = function getToken(callback){
request(options, function(error, response, body){
if (error) throw new Error(error);
callback( requestToken(body) );
});
};
function requestToken (body) {
authToken = response.body.toString().split('\n')[1].split(":")[1].split('"')[1];
return authToken;
};
此外,删除此不受欢迎的行,因为您的回调将是返回主应用程序的传递机制:
module.exports.token = authToken; // remove this
然后,您可以使用类似的内容在主应用中获取令牌:
gcdm.getToken( function (token) {
console.log('main.js says :' + token);
});
您可能希望更多地了解JavaScript中的异步编程。它是NodeJS工具箱中的关键组成部分。
答案 2 :(得分:0)
@shennan非常感谢你!你是正确的,你是对的,请求是异步的。我对node.js相当新,所以感谢与我的关系,我仍然试图绕过回调。 (感谢@Drazisil获取callbackhell.com)的链接
你的答案让我指向正确的方向,我最终得到了这个:
//auth.js
var request = require("request");
var authModule = function () {};
var authToken = "";
var options = {
method: 'POST',
url: 'https://dummy.url/oauth/token',
headers: {
'authorization': 'Basic secretkeystring',
'accept': 'application/json',
'content-type': 'application/x-www-form-urlencoded'
},
form: {
grant_type: 'password',
username: 'indegomontoya',
password: 'sixfingeredman'
}
};
authModule.getToken = function getToken(callback){
request(options, function(error, response, body){
if (error) throw new Error(error);
authToken = response.body;
callback( requestToken(body) );
});
};
function requestToken (body) {
return authToken;
};
module.exports = authModule;
和
//main.js
var auth = require("./auth.js");
var authTokenData;
function parseAuthJson(data) {
var jsonData = JSON.parse(data);
return jsonData;
}
auth.getToken( function (authTokenData) {
var jsonData = parseAuthJson(authTokenData);
console.log(jsonData.access_token);
});
我收集了有关解析JSON here的帮助。
感谢您的帮助!