【问题标题】:Node.js module level variables are undefinedNode.js 模块级变量未定义
【发布时间】:2013-10-29 17:52:56
【问题描述】:

我在从所述模块内部的函数中访问模块级变量的范围时遇到问题。见下文...

var socketio = require('socket.io');
var socket = socketio.listen();

var myCustomModule = require('./lib/mycustommodule')('http://mysite:8080');

socket.on('connection', function connection(socket) {

    socket.emit('message', {data:"test1"});  <====THIS WORKS

    socket.on('init', function init(data) {

        socket.emit('message', {data:"test1"});  <====THIS WORKS

        refreshMyCustomModule();
    });

});

var refreshMyCustomModule = function() {

    socket.emit('message', {data:"test1"}); <=====THIS DOESN'T WORK

    myCustomModule.beginSomeAsyncTask(function(data) { <======THIS DOESN'T WORK

         socket.emit('message', {data:"test2"}); <========THIS DOESN'T WORK

    });

};

查看上面的示例。当我突然调用我的 refreshMyCustomModule 函数时,socketmyCustomModule 变得未定义。我也尝试过使用它以及设置var self = this

我在客户端上用 javascript 编写了一堆代码,但是在 node.js 中编码时,范围似乎不同,我就是无法破解这个问题。

【问题讨论】:

  • 范围规则相同。 JavaScript,语言,定义了范围规则。 NodeJS 和浏览器,环境,没有。

标签: javascript node.js scope


【解决方案1】:

请注意,脚本全局级别的socketfunction connection 中的socket 是两个不同的变量function connection 中的一个是 argument,它是从连接事件传递给该函数的。您在refreshMyCustomModule 中使用的那个是全局的,也就是您调用listen 的那个。

如果我们更改它们的名称会更清楚,因为它们是不同的变量:

var socketio = require('socket.io');
var socketUsedForListen = socketio.listen();

var myCustomModule = require('./lib/mycustommodule')('http://mysite:8080');

socketUsedForListen.on('connection', function connection(socketFromConnection) {

    socketFromConnection.emit('message', {data:"test1"});

    socketFromConnection.on('init', function init(data) {

        socketFromConnection.emit('message', {data:"test1"});

        refreshMyCustomModule();
    });

});

var refreshMyCustomModule = function() {

    socketUsedForListen.emit('message', {data:"test1"});

    myCustomModule.beginSomeAsyncTask(function(data) {

         socketUsedForListen.emit('message', {data:"test2"});

    });

};

我有理由确定您意味着refreshMyCustomModule 中使用socketFromConnection,而不是socketUsedForListen。如果是这样,请将refreshMyCustomModule 移入您的连接回调,或者将套接字作为参数传递给它。

【讨论】:

  • +1 @T.J. Crowder ,这帮助我理解了为什么我的套接字变量不正确。谢谢你。我完全错过了。
【解决方案2】:

这是因为您在 socket.on('init') 中使用了异步事件,这会导致范围问题。我相信,如果您从父级传递要使用的参数,它将起作用。例如:

var socketio = require('socket.io');
var socket = socketio.listen();

var myCustomModule = require('./lib/mycustommodule')('http://mysite:8080');

socket.on('connection', function connection(socket) {
    socket.emit('message', {data:"test1"});  <====THIS WORKS

    socket.on('init', function init(data) {

        socket.emit('message', {data:"test1"});  <====THIS WORKS

        refreshMyCustomModule(socket, myCustomModule);
    });

});

var refreshMyCustomModule = function(socket, module) {

    socket.emit('message', {data:"test1"}); <=====THIS DOESN'T WORK

    module.beginSomeAsyncTask(function(data) { <======THIS DOESN'T WORK

         socket.emit('message', {data:"test2"}); <========THIS DOESN'T WORK

    });

};

【讨论】:

    猜你喜欢
    • 2015-01-02
    • 2020-07-19
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多