如何在节点js中分配全局变量和局部变量

时间:2016-05-06 04:54:32

标签: node.js httprequest local json-web-token

如果我声明一个变量并从方法中赋值并在方法外打印。但它显示未定义。 我的代码是,

var value;
var getValue = function getValue(){
    value = 5;
};
console.log(value); 

输出,

undefined

我也在尝试全局变量

var getValue = function getValue(){
    global.value = 5;
};
console.log(value);

但是显示了一些错误,

console.log(value);
            ^

ReferenceError: value is not defined
    at Object.<anonymous> (~/MyApp/test.js:8:13)
    at Module._compile (module.js:413:34)
    at Object.Module._extensions..js (module.js:422:10)
    at Module.load (module.js:357:32)
    at Function.Module._load (module.js:314:12)
    at Function.Module.runMain (module.js:447:10)
    at startup (node.js:146:18)
    at node.js:404:3

3 个答案:

答案 0 :(得分:4)

在第一个示例中,在函数中设置了值,但从不调用函数。因此,值为undefined

在全局示例中,永远不会声明值,因此未定义。

您要做的是调用getValue(),然后将值输出到控制台。

第一个例子:

var value;
var getValue = function(){
    value = 5;
};
getValue();
console.log(value); // should return 5

全球范例:

var global = {}; // create an object otherwise you get a 'global is not defined' error
var getValue = function getValue(){
    global.value = 5;
};
getValue();
console.log(global.value); // should return 5

答案 1 :(得分:2)

您的功能未运行,因此未设置值。

var value;
var getValue = function getValue(){
    value = 5;
};
getValue(); // call function to set value of 'value'

console.log(value); 

答案 2 :(得分:1)

您的问题是您不等待回执被执行。

而不是

app.post('/authenticate', function(req, res) {
    var userToken;
    ...
    amqHandler.reciveData(amqpConnection ,function(err,data){
        if(!err){
            httpRequestHandler. makeHttpRequest(data, function(err,userToken){
                global.apiResponce = JSON.parse(userToken).token;
                global.convertedObjects = JSON.stringify(apiResponce);
                console.log("convertedObjects==>"+convertedObjects);
                userToken = {token:JSON.stringify(apiResponce)};
            });
        }
    });
    res.send({msg:userToken}); // this is executed before the end of reciveData
});

您必须从发送响应传递给异步函数的回调:

app.post('/authenticate', function(req, res) {
    ...
    amqHandler.reciveData(amqpConnection ,function(err,data){
        if(!err){
            httpRequestHandler. makeHttpRequest(data, function(err,userToken){
                global.apiResponce = JSON.parse(userToken).token;
                global.convertedObjects = JSON.stringify(apiResponce);
                console.log("convertedObjects==>"+convertedObjects);
                var userToken = {token:JSON.stringify(apiResponce)};
                res.send({msg:userToken}); // <=== send here
            });
        }
    });
});

请注意,有一些结构,最值得注意的是promises,它可以更容易地链接异步调用。但是你必须先了解这个问题,然后看看如何用回调处理它。