NodeJS中如何在引入的代码内使用局部变量?
问题:局部变量无法在require-dir加载的模块中访问
尝试在require-dir加载的模块中使用父作用域的局部变量id,但运行时出现错误。
app.js 代码
import RequireDir from "require-dir"; import { Server, Socket } from "socket.io"; // ... client.on("connection", (socket) => { const id = socket.id; RequireDir("./data", { recurse: true, noCache: true }); });
data/main.js 代码
console.log(id);
错误信息
ReferenceError: id is not defined
解决方案
方法1:将变量作为参数传递给模块(推荐)
require-dir加载的模块默认无法直接访问父作用域的局部变量,你可以让模块导出函数,在加载后主动调用并传入变量:
修改app.js:
import RequireDir from "require-dir"; import { Server, Socket } from "socket.io"; // ... client.on("connection", (socket) => { const id = socket.id; // 加载所有模块 const modules = RequireDir("./data", { recurse: true, noCache: true }); // 遍历模块并调用导出的函数 Object.values(modules).forEach(module => { // 兼容ES模块的default导出和CommonJS导出 const handler = module.default || module; if (typeof handler === 'function') { handler(id); } }); });
修改data/main.js:
// 导出函数接收id参数 export default function(id) { console.log(id); }
方法2:使用全局变量(不推荐)
如果只是临时测试,可以把变量挂载到全局对象上,但要注意全局变量可能导致命名冲突和内存泄漏:
修改app.js:
client.on("connection", (socket) => { // 将id挂载到全局 global.socketId = socket.id; RequireDir("./data", { recurse: true, noCache: true }); // 连接断开时清理全局变量 socket.on("disconnect", () => { delete global.socketId; }); });
修改data/main.js:
console.log(global.socketId);
内容的提问来源于stack exchange,提问作者Maor Bari
相关产品推荐
相关产品推荐

