【问题标题】:Cross import in node.jsnode.js 中的交叉导入
【发布时间】:2021-07-31 21:14:11
【问题描述】:

我正在使用 typescript 制作一个 node.js 项目。我想将我的 socket.io 代码放在一个单独的文件中进行组织。 我在控制台中看到 socketHandling.ts 在 index.ts 之前加载,我觉得这很奇怪。

但问题是socketHandling.ts中的Typeof server是未定义的。

如何确保在执行 socketHandling.ts 之前定义 index.ts 中的服务器变量?

index.ts

import * as express from "express";
import * as path from "path";
import * as socketHandle from "./socketHandling";
console.log("index.ts loaded");

export const server = express()
  .use(express.static(path.join(__dirname, "../../public")))
  .set("views", path.join(__dirname, "../../views"))
  .set("view engine", "ejs")
  .get("/*", httpGet)
  .post("/*", httpPost)
  .listen(PORT, () => console.log(`Listening on ${PORT}`));

socketHandle.initSockets();

socketHandling.ts

import { Server } from "socket.io";
import { server } from "./index";
console.log("socketHandling.ts loaded");

console.log(server);
const io = new Server(server);

export function initSockets(): void {
  io.on("connection", (socket) => {
    console.log(`Client connected ${socket.id}`);
    socket.on("disconnect", () => {
      console.log(`Client disconnected ${socket.id}`);
    });
  });
}

【问题讨论】:

    标签: javascript node.js typescript express socket.io


    【解决方案1】:

    为什么在定义索引服务器之前要经过socketHandling?

    如果 index.ts 是您的入口点,一旦程序计数器到达 index.ts 的第 3 行,导入将使其开始执行 socketHandling.ts,其中包含另一个返回 index.ts 的导入,这甚至没有执行完毕。所以这看起来像一个循环导入,也许你应该完全避免这种情况。

    建议的解决方案: 通过将服务器从顶部传递到您从库文件导入的 initSockets 方法来避免循环导入。

    尝试以下重构:

    index.ts

    import * as express from "express";
    import * as path from "path";
    import * as socketHandle from "./socketHandling";
    console.log("index.ts loaded");
    
    export const server = express()
      .use(express.static(path.join(__dirname, "../../public")))
      .set("views", path.join(__dirname, "../../views"))
      .set("view engine", "ejs")
      .get("/*", httpGet)
      .post("/*", httpPost)
      .listen(PORT, () => console.log(`Listening on ${PORT}`));
    
    socketHandle.initSockets(server);
    

    socketHandling.ts

    import { Server } from "socket.io";
    console.log("socketHandling.ts loaded");
    
    let io: Server;
    
    export function initSockets(server): void {
      if (!io) {
          io = new Server(server);
      }
      io.on("connection", (socket) => {
        console.log(`Client connected ${socket.id}`);
        socket.on("disconnect", () => {
          console.log(`Client disconnected ${socket.id}`);
        });
      });
    }
    

    通常,从应用程序入口点导出内容以供整个库使用是不可持续的。通常您会看到这些类型的变量被传递到方法中,而不是在整个应用程序的不同文件中全局引用。

    【讨论】:

      猜你喜欢
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-18
      • 2010-11-22
      • 2013-05-10
      相关资源
      最近更新 更多