Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 来自模块的node.js变量_Javascript_Node.js - Fatal编程技术网

Javascript 来自模块的node.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

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


编辑:键入代码。

似乎
请求
模块(从)本质上是异步的,这意味着返回数据可能需要任何时间长度。这意味着您在使用
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
目前不会对其造成影响(尽管将来如果他的名称空间发生更改肯定会有影响,因此我建议他删除该行)。我相信,由于它是异步的,因此您需要回调。这对我理解他们有很大帮助。