首页 > 解决方案 > 在 node/express 中的 db 查询后从 socket.io 发出

问题描述

我有一个组件,当它安装时,它会向我的服务器发出请求以获取(非常长的)名称列表。为了不阻止我的组件的渲染(因为它只能使用非空列表渲染),我想使用套接字向它发送一系列小得多的列表,而不是一个长列表res.send()(其中大约需要 4 秒)。

为此,我在我的 express 服务器中使用了 socket.io,但我收到了 404 错误。这是我的设置:

客户端(组件)

    import socketIOClient from 'socket.io-client';

    componentDidMount() {
        console.log('trying to put on sock');
        const socket = socketIOClient();
        socket.on('names', data => console.log('data'));
    }

该组件的父组件是调用api/v1/names路由的组件。

服务器

    const express = require('express');    
    const socketIo = require('socket.io');
    const http = require('http');

    const app = express();
    app.use(express.static(path.resolve(__dirname, '../build')));
    const server = http.createServer(app);
    const io = socketIo(server);

    app.get('/api/v1/names', (req, res) => {
      res.set('Content-Type', 'application/json');
      getNames().then((result) => {
        // res.send({ result }); what I was doing before (~4 seconds)

        io.on('connection', (socket) => {
          console.log('New client connected');
          // chunk the results into 10 smaller arrays
          let final = false;
          const parts = _.chunk(result, 10);
          parts.forEach((part, pIx) => {
            if (pIx === parts.length - 1) final = true;
            // Will this be async or not? we shall see...
            socket.emit('names', { result: part, final });
          });
          socket.on('disconnect', () => {
            console.log('Client disconnected');
          });
        });
      });
    });

最终发生的是我的控制台中的这个错误:GET http://localhost:3000/socket.io/?EIO=3&transport=polling&t=123kj123b 404 (Not Found). 永远不会发生的日志io.on('connection')。看到日志,trying to put on sock所以我知道它正在尝试听。

标签: node.jsexpresssocket.io

解决方案


您可以参考此链接socket.io-client

var socket = require('socket.io-client')('http://localhost:4200');
socket.on('connect', function(){});
socket.on('event', function(data){});
socket.on('disconnect', function(){});

需要像这样连接服务器。


推荐阅读