【问题标题】:node.js variables from a module来自模块的 node.js 变量
【发布时间】:2015-11-19 14:14:42
【问题描述】:

我不知道如何从 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 的示例,但我需要做相反的事情。非常感谢任何帮助!

编辑:代码中的错字。

【问题讨论】:

  • 我相信,因为它是异步的,你会想要一个回调。 callbackhell.com 对我的理解帮助很大。

标签: javascript node.js


【解决方案1】:

尝试传递哈希值。

module.exports = {
  module: authModule,
  token: authToken
}

var gcdm = require("./gcdm.js");

gcdm.module();
gcdm.token;

【讨论】:

    【解决方案2】:

    似乎request 模块(来自here)本质上是异步的,这意味着它可能需要任何时间来返回其数据。这意味着您在使用getToken 方法时可能需要使用回调。

    目前,您的main.js 应用程序没有给auth.js 模块足够的时间来获取令牌数据。它请求令牌,然后在同一时间(或处理器的滴答声)尝试将其打印到控制台。要解决这个问题,您需要使用回调。

    我可能会像这样调整您的两个身份验证模块方法:

    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 工具箱中的关键要素。

    【讨论】:

    • 我认为 OP 的主要问题是他不明白 export 在节点中的工作原理。很好的答案,+1
    • @Oleander 干杯。这是可能的,但他所做的并没有在技术上“破坏”导出功能。他的 module.exports 变量已经被设置为任意对象,因此添加 module.exports.token 目前并没有伤害它(尽管如果他的命名空间发生变化,将来肯定可以这样做 - 因此我建议他删除该行)。
    【解决方案3】:

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

    感谢您的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-11
      • 2013-08-30
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多