节点.js模块级变量未定义

Node.js module level variables are undefined

本文关键字:变量 未定义 模块 js 节点      更新时间:2023-09-26

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

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

看看上面的示例。当我调用刷新我的自定义模块函数时,突然socket并且myCustomModule变得未定义。我也尝试使用它以及设置var self = this.

我已经在客户端上用javascript编写了一堆,但是在node中编码时.js范围似乎有所不同,我只是无法破解这个坚果。

请注意,脚本全局级别的socketfunction connection中的socket是两个不同的变量function connection 中的参数是从连接事件传递到该函数的参数。您在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"});
    });
};

我有理由确定你的意思是用socketFromConnection refreshMyCustomModule,而不是socketUsedForListen。如果是这样,请将refreshMyCustomModule移动到连接回调,或者将套接字作为参数传入其中。

这是因为您在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
    });
};