来自模块的node.js变量

时间:2015-11-19 14:14:43

标签: 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/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发送变量的例子,但我需要做相反的事情。非常感谢任何帮助!

编辑:代码中的拼写错误。

3 个答案:

答案 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的帮助。

感谢您的帮助!