【问题标题】:Problems connecting to my NodeJs server socket and typescript连接到我的 NodeJs 服务器套接字和打字稿的问题
【发布时间】:2020-09-13 03:08:42
【问题描述】:

我已经尝试了一切,我不能再浪费时间了,请需要帮助,我一直在尝试运行这篇文章中的代码:https://medium.com/@mogold/nodejs-socket-io-express-multiple-modules-13f9f7daed4c,我一直在尝试运行代码这篇文章,我非常喜欢它,因为我认为它非常适合大型项目,当我想连接它时出现问题,向我抛出以下错误: 控制台: 我已经尝试设置在我的应用程序的标题中,我尝试了从类似问题中读取的代码,但没有一个有效,我将 server.ts、socket.ts、job.ts 和 routes.ts 的条件留给你,我希望你能请帮帮我:c

server.ts

 import  express  from "express";
    
    const http = require("http");
    import { router} from  './routes/routes';
    import bodyParser from "body-parser";
    import  morgan from "morgan";
    import { PORT} from "./core/utils/config"
    import errorMiddleware from './core/middleware/error.middleware';
    import socket from "./socket";
    
    const app = express();
    const server = http.createServer(app);
    
    
    app.use(bodyParser.json());
    app.use(router);
    app.use(morgan("dev"));
    app.use(errorMiddleware);
    app.listen(3000, ()=> console.log("[SERVER] list is running in port http://localhost:"+PORT));
    
    socket.connect(server);

socket.ts

let connection: any = null;

export class Socket {
  socket: any;

  constructor() {
    this.socket = null;
  }


  connect(server: any) {
    const io = require("socket.io").listen(server);
    io.on("connection", (socket: any) => {
      this.socket = socket;
    });
  }
  emit(event: any, data: any) {
    this.socket.emit(event, data);
  }

  static init(server: any) {
    if (!connection) {
      connection = new Socket();
      connection.connect(server);
    }
  }
  static getConnection() {
    if (connection) {
      return connection;
    }
  }
}


export default {
  connect: Socket.init,
  connection: Socket.getConnection
}

job.ts

import socket from "../../../socket";
export class JobSockets {

  emitUpdate() {
    const connection = socket.connection();

    if (connection) {

      connection.emit("jobs", {
        hola: "hola desde mi backend"
      });

    }
  }
}

routes.ts

    import express from "express";
    import indexAppointment from "../features/Appointment/routes/index";
    import indexUser from "../features/User/routes/index";
    import cors from "cors";
    
    const router = express.Router();
    const options: cors.CorsOptions = {
        allowedHeaders: [
            'Origin',
            'X-Requested-With',
            'Content-Type',
            'Accept',
            'X-Access-Token',
        ],
        credentials: true,
        methods: 'GET,HEAD,OPTIONS,PUT,PATCH,POST,DELETE',
        origin: "*",
        preflightContinue: false,
    };
    
    router.use(cors(options));
    router.options('*', cors(options));
    router.use(indexAppointment);
    router.use(indexUser);
    
    
    export {
        router
    };

客户端索引.html

<html>

<head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.0/socket.io.js"></script>
</head>

<body>
    <p>Check the console to see the messages coming through</p>
    <script>
        let socket;
        window.onload = () => {
            socket = io.connect("http://192.168.1.7:3000");
            socket.on("jobs", (msg) => {
                console.log(msg)
            })
        };
    </script>
</body>

</html>

从“../features/Appointment/routes/index”导入indexAppointment;

import expres from "express"
import getAppointment from "./getAppointment/getAppointment";
import createAppoinment from "./createAppointment/create_appointment";
import updateAppoinment from "./updateAppointment/update_appointment";
import deleteAppoinment from "./deleteAppointment/delete_appointment";

const router = expres.Router();

router.use("/appointment",getAppointment);
router.use("/appointment",createAppoinment);
router.use("/appointment",updateAppoinment);
router.use("/appointment",deleteAppoinment);


export default router;

从“../features/User/routes/index”导入 indexUser;

import expres from "express"
import createUser from "./createUser/create_user";
import deleteUser from "./deleteUser/delete_user";
import updateUser from "./updateUser/update_user";
import getUsers from "./getUser/get_user";
import createUserInfoAppointment from "./createUserInfoAppointment/create_user_info_appointment";
import getUserInfoAppointments from "./getuserinfoappointment/get_user_info_appointment";

const router = expres.Router();

router.use("/user",createUser);
router.use("/user",deleteUser);
router.use("/user",updateUser);
router.use("/user",getUsers);
//managment use case
router.use("/user",createUserInfoAppointment);
router.use("/user",getUserInfoAppointments);


export default router;

【问题讨论】:

  • 您似乎没有任何端点可以从定义的前端命中。你能分享 indexAppointment 和 indexUser 的内容吗?另外 /socket.io 不应该是前端命中的内容,您可以将自定义路径传递给套接字连接以进行测试。您将需要在代码中定义该子路径。 socket.io/docs/client-api 看自定义路径。
  • 我刚刚更新了它,实际上对它们进行了索引,我用来将逻辑与用户路径和约会分开
  • decasualidad hablas español ? :c

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


【解决方案1】:

默认情况下,前端 socket.io 将连接到路径 /socket.io 在提供的 url。在您的情况下,它是localhost:3000。您似乎没有任何重新定义此端点的路由,这很好。

问题似乎是服务器的启动方式。您希望 http 成为此处的侦听器,而不是 express 应用程序。因此,请执行以下操作,

删除这部分

  app.listen(3000, ()=> console.log("[SERVER] list is running in port http://localhost:"+PORT));

然后添加这个

  app.set( "ipaddr", "127.0.0.1" ); --> May be omitted since you're using a different ip. This way it lets app use the ip that it finds. So try it without first and see if that works. If not, then change to your ip.
  app.set( "port", 3000 );

  server.listen(3000, () => {

console.log('服务器正在端口上运行', server.address().port); });

【讨论】:

  • 我犯了这个错误:c http.listen(3000, () => {console.log('server is running on port', server.address().port); }); ^ TypeError: http.listen 不是函数
  • 不再给我任何错误,但我没有收到来自客户端的消息,你知道我做错了吗:c?,我刚刚上传了一张照片,html 是一样的
  • 您需要调用服务器以便在您的后端代码中调用函数emitUpdate。因为这就是将消息发送到前端的内容。目前什么都没有开始通信,所以什么都没有发生
  • 我已经工作了,非常感谢,你救了我的命 haha​​j 最后一次咨询,生产中剩下“ipaddr”,“127.0.0.1”?
  • 这完全取决于您的服务器是如何托管/部署的。一些服务器使用 localhost,其他服务器使用一系列 ips。所以我无法真正回答这个问题,因为我不知道你是如何部署它的。
猜你喜欢
  • 2018-03-20
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 2020-01-04
  • 2016-12-21
  • 2011-09-21
相关资源
最近更新 更多