javascript - 如何在 Next.js 中实现 React hook Socketio

标签 javascript node.js socket.io next.js

我尝试从 Google 寻找方法,但结果还是一样

 http://localhost:8000/socket.io/?EIO=3&transport=polling&t=MnHYrvR

我试试这个wan medium尝试其他方法,结果还是一样

对于前端我已经尝试过了,socket io在钩子(Hook)组件内部和范围之外,结果保持不变

http://localhost:8000/socket.io/?EIO=3&transport=polling&t=MnHYrvR

这是我来自服务器的代码:

app.prepare().then(() => {
    const server    = express();
    const setServer = require('http').Server(server);
    const io        = require('socket.io')(setServer)

    server.use(bodyParser.json());
    server.use(cookieParser());

    io.on('connection', socket => {
        console.log('socket', socket);

        socket.emit('now', {
            message: 'zeit'
        })
    })


    server.use(routers)

    server.get('*', (req, res) => {
        return handle(req, res);
    });

    server.use( (err, req, res, next) => {
        console.log(err)
        if(err.name === 'Error'){
            res.status(401).send({
                title: 'error',
                detail: 'Unauthorized Access!'
            })
        }
    })

    server.listen(port, err => {
        if (err) throw err;
        console.log(`> Ready on http://heroku:${port}`)
    })
})
.catch(ex => {
    console.error(ex.stack);
    process.exit(1);
});

从前端:

//at the top of function
const io = require('socket.io-client');
const socket = io.connect('http://localhost:8000');
console.log('socket', socket);

//in use effect
useEffect(() =>{
        socket.on('now', message => {
            console.log('message', meesage);
        })
    })

请帮忙

最佳答案

虽然我没有使用 Next.js,但我对 Express.js 有类似的设置,可能会帮助您解决问题...

在我的 Node.js 端,我有以下设置:

const app = require('express')()
const server = require('http').createServer(app)
const io = require('socket.io')(server)

// ...

io.sockets.on('connection', () => {
  console.log(`Client with ID of ${socket.id} connected!`)

  io.sockets.emit('SOME_EVENT', 'HelloWorld')
})

然后,我的 React 前端看起来像这样:

import React from 'react'
import io from 'socket.io-client'

function useSocket(url) {
  const [socket, setSocket] = useState(null)

  useEffect(() => {
    const socketIo = io(url)

    setSocket(socketIo)

    function cleanup() {
      socketIo.disconnect()
    }
    return cleanup

    // should only run once and not on every re-render,
    // so pass an empty array
  }, [])

  return socket
}

function App() {
  const socket = useSocket('http://127.0.0.1:9080')

  useEffect(() => {
    function handleEvent(payload) {
      console.log(payload) 
      // HelloWorld
    }
    if (socket) {
      socket.on('SOME_EVENT', handleEvent)
    }
  }, [socket])

  return (...)
}
<小时/>

此外,我在使用 socket.io 时看到的一个常见错误如下:

Cross-Origin Request Blocked: The Same Origin Policy disallows 
reading the remote resource at 
http://127.0.0.1:9080/socket.io/?EIO=3&transport=polling&t=MnH-W4S.
(Reason: CORS request did not succeed).

这是由于在套接字管理器创建过程中作为参数提供的 URL 不正确造成的:

const socket = io('http://localhost');

因此,请仔细检查您提供的地址是否正确。如果您在 now 上提供应用程序并通过 now.sh URL 访问它,但提供 http://localhost 作为 URL 参数,那么它将无法工作。

关于javascript - 如何在 Next.js 中实现 React hook Socketio,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57323350/

相关文章:

javascript - 过滤器在 ng-repeat 中不起作用

javascript - 使用聚合管道聚合 MongoDB 中的时间戳集合

javascript - 如何让 discord.js 机器人仅在用户响应后才回复一系列 DM 消息?

node.js - Nock 不适用于一起运行的多个测试

javascript - 我的 SocketIO 脚本始终发送相同的数据

node.js - Socket.io房间broadcast.to和sockets.in的区别

javascript - jQuery 弹性缓动方程

jquery - 将服务器端数据从 ejs 传递到 Ajax

node.js - Aws Lambda 响应错误

javascript - 将文件 base64 发送到 Node.js socket.io 服务器