NodeJS 如何在函数中使用尚未定义的全局变量

xesrikrc  于 2023-01-01  发布在  Node.js
关注(0)|答案(1)|浏览(150)

你好,
我有一个套接字应用程序,其文件结构在app. js中定义如下:

require("../chat/variables");
require("../chat/functions");
require("../chat/connect");

app.get('/', function (req, res, next) {
 res.sendFile(__dirname + '/index.html');
});

httpServer.listen(port, () => {
 console.log(`Socket.IO server running`);
});

变量文件如下所示:

// server
app = require("express")();
httpServer = require("https").createServer({},app);
io = require("socket.io")(httpServer, {      //socket server path
  path: "/"
});

函数文件是这样的:

makesession = function(vdata) {   //store user data for this session
    if(socket) {
     socket.userid = vdata.userid;
     socket.username = vdata.name;
    }
   });

为每个用户执行连接的文件如下所示:

io.on('connection', (socket) => {   //user connects to socket
   memberdata().then(v => {
    makesession(v);
   });
});

但是我在函数文件中得到一个错误,说套接字没有定义。为什么会这样?我认为使用if条件已经足够了,所以它只在套接字定义后触发。
谢谢你。

von4xj4u

von4xj4u1#

尝试将socket作为参数添加到makesession,如下所示:

makesession = function(socket, vdata) {   //store user data for this session
    if(socket) {
     socket.userid = vdata.userid;
     socket.username = vdata.name;
    }
   });

io.on('connection', (socket) => {   //user connects to socket
   memberdata().then(v => {
    makesession(socket, v);
   });
});

在你的原始代码中,socket并没有在makesession中定义,因为socket在回调中是一个局部(而不是全局)变量,Javascript使用的是词法作用域,而不是动态作用域,所以回调中的变量在makeSession中是不可见的。

相关问题