如何使用import语法在Node.js中导入Socket.io

4

我不确定为什么会出现错误。当我尝试使用request做同样的事情时,它却可以正常工作。

import express from 'express';
import { createServer } from 'http';
import * as io from 'socket.io';

const app = express();
const server = createServer(app);
const socketio = io(server);

错误

const socketio = io(server);
                 ^

TypeError: io is not a function

这个回答解决了您的问题吗?向ES6模块导入传递选项 - turivishal
不好意思,我需要看到原始的英文内容才能翻译。 - John John
4个回答

13

你应该尝试这个替代方案

import { Server } from "socket.io";
const httpServer = createServer();
const io = new Server(httpServer, {
  // ...
});

在这里查看 Socket.io 初始化


4

这里是答案

import { Server } from 'socket.io';
import express from 'express';
import { createServer } from 'http';

const app = express(); 
const server = createServer(app); 
const socketio = new Server(server);

3
你说得对,但更好的做法是使用import { Server } from "socket.io"; - paulsm4

3

以下是使用Express和ES模块初始化Socket.io的更好、更专业的2021年方法:

下面是在文件Socket.js中的导入和初始化代码:

    import { Server } from 'socket.io';
    
    class SocketServer {
      constructor(server) {
        const io = new Server(server);
    
        this.socket = io.of('/session').on('connection', (socket) => {
          const chatApiInstance = JSON.parse(
            socket.handshake.query.chatApiInstance
          );
    
          if (chatApiInstance) {
            socket.join(chatApiInstance);
          }
        });
      }
    
      onNewMessage(chatApiInstance, message) {
      
        this.socket.to(chatApiInstance).emit('newMessage', JSON.stringify(message));
      }
    
      onStatusUpdate(chatApiInstance, status) {

        this.socket.to(chatApiInstance).emit('statusChange', status);
      }
    }
    
    export default SocketServer;

然后,在您的 Server.js 中,您应该像这样导入 Socket.js:

import app from './app';
import SocketServer from './socket';

const server = app.listen(process.env.PORT || 3333, '0.0.0.0');

const Socket = new SocketServer(server);

export default Socket;

那么你需要一个控制器来处理这个请求,就像这样:

import Socket from '../../server';

class SessionController {
  async create(request, response) {
    const { instanceId, messages, status } = request.body;

    if (messages && messages.length) {
      Socket.onNewMessage(instanceId, messages[0]);
    } else if (status) {
      Socket.onStatusUpdate(instanceId, status);
    }

    return response.send('OK');
  }
}

export default new SessionController();


最后一步,不要忘记添加路由,如下所示:
import { Router } from 'express';

import SessionController from '../Controllers/SessionController';

const sessionRouter = Router();

sessionRouter.post('/', SessionController.create);

export default sessionRouter;


点击此处查看Socket.io v3的初始化详细信息: https://socket.io/docs/v3/server-initialization/index.html


1

试试这个:

import * as io from "socket.io"
import express from 'express';
import { createServer } from 'http';

const app = express(); 
const server = createServer(app); 
const socketio = new io.Server(server);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接