9

I have tried to find a way from Google but the results can remain the same

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

i try this wan medium try other ways, the results remain the same

and for the front end I have tried, socket io inside the hook component and outside the scope, the results remain the same

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

this is my code from server:

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);
});

from front end:

//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);
        })
    })

Please help

3
  • try useeffect with empty dep [], as your code right now it makes connection on every render Commented Aug 2, 2019 at 9:13
  • still get the same results.. i dont know why Commented Aug 2, 2019 at 9:17
  • What is the exact error and/or warning that you're seeing? Commented Aug 2, 2019 at 10:55

2 Answers 2

13

Although I am not using Next.js, I have a similar setup with Express.js that might help you with your problem...

On my Node.js side I have the following setup:

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')
})

Then, my frontend with React looks like this:

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 (...)
}

Also, one common error that I am seeing when working with socket.io is the following:

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).

This is due an incorrect URL that's provided as a parameter in the socket manager creation process:

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

So just double check that the address you're providing is correct. If you're serving your application on now and accessing it through a now.sh URL, but providing http://localhost as your URL parameter, then it won't work.

Sign up to request clarification or add additional context in comments.

1 Comment

in the end I was told to use express only so thanks for the help
0

(I realise that this is an old/stale question, but in the spirit of "The Wisdom of the Ancients".)

I came across this question because I had the exact same problem. I realised that I was using the wrong server to listen with. Instead of Express, you should use the HTTP module.

    const setServer = require('http').Server(server);
    const io        = require('socket.io')(setServer)

So, this part...

    server.listen(port, err => {
        if (err) throw err;
        console.log(`> Ready on http://heroku:${port}`)
    })

...should become:

    setServer.listen(port, err => {
        if (err) throw err;
        console.log(`> Ready on http://heroku:${port}`)
    })

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.