Javascript 来自模块的node.js变量
我不知道如何从node.js模块获取变量。我正在创建一个模块,该模块将与身份验证机制接口,目前它只返回一个令牌。我在main.js中需要这个令牌,因为我将调用其他模块,并传递这个令牌进行身份验证Javascript 来自模块的node.js变量,javascript,node.js,Javascript,Node.js,我不知道如何从node.js模块获取变量。我正在创建一个模块,该模块将与身份验证机制接口,目前它只返回一个令牌。我在main.js中需要这个令牌,因为我将调用其他模块,并传递这个令牌进行身份验证 //auth.js var request = require("request"); var authModule = {}; var authToken = ""; var options = { method: 'POST', url: 'https://dummy.url/oa
//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的例子,但我需要做相反的事情。非常感谢您的帮助
编辑:键入代码。似乎
请求
模块(从)本质上是异步的,这意味着返回数据可能需要任何时间长度。这意味着您在使用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);
});
然后,您可以使用类似以下内容在主应用程序中获取令牌:
module.exports.token = authToken; // remove this
gcdm.getToken( function (token) {
console.log('main.js says :' + token);
});
您可能希望进一步了解JavaScript中的异步编程。它是NodeJS工具箱中的一个关键组成部分。尝试传递散列
module.exports = {
module: authModule,
token: authToken
}
var gcdm = require("./gcdm.js");
gcdm.module();
gcdm.token;
@深南非常感谢!您已经步入正轨,并且您是正确的,请求是异步的。我对node.js还比较陌生,所以感谢您对我的支持,我仍在努力解决回调问题。(感谢@Drazisil链接到) 你的回答让我找到了正确的方向,我最终得出了这样的结论:
//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;
以及:
我收集了有关解析JSON的帮助
谢谢你的帮助 我认为OP的主要问题是他不理解
export
如何在节点中工作。回答得好,tho+1@Oleander干杯这是可能的,但他所做的任何事情都不会从技术上“破坏”导出功能。他的module.exports
变量已被设置为任意对象,因此添加module.exports.token
目前不会对其造成影响(尽管将来如果他的名称空间发生更改肯定会有影响,因此我建议他删除该行)。我相信,由于它是异步的,因此您需要回调。这对我理解他们有很大帮助。