Node.js模块级variables是未定义的

我有一个问题访问模块级别variables范围内的一个函数内的模块。 见下文…

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中编码时,似乎是范围是不同的,我不能破解这个螺母。

这是因为你在socket.on('init')中使用asynchronous事件,导致范围问题。 我相信,如果你从父母传递你想使用的参数,它将工作。 例如:

 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 }); }; 

请注意,脚本和socket在您的function connection的全局级别的socket 是两个不同的variablesfunction connection中的一个是从连接事件传递给该函数的参数 。 你在refreshMyCustomModule使用的是全局的,你调用listen那个。

如果我们改变他们的名字,这是更清楚的,因为他们是不同的variables:

 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 移入连接callback,或将套接字作为parameter passing给它。