如何在 Next.js 中实现 React hook Socketio
How To Implement React hook Socketio in 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 参数,那么它不会工作。
(我意识到这是一个 old/stale 问题,但本着“The Wisdom of the Ancients”的精神。)
我遇到这个问题是因为我遇到了完全相同的问题。我意识到我使用了错误的服务器来收听。您应该使用 HTTP 模块而不是 Express。
const setServer = require('http').Server(server);
const io = require('socket.io')(setServer)
所以,这部分...
server.listen(port, err => {
if (err) throw err;
console.log(`> Ready on http://heroku:${port}`)
})
...应该变成:
setServer.listen(port, err => {
if (err) throw err;
console.log(`> Ready on http://heroku:${port}`)
})
我尝试从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 参数,那么它不会工作。
(我意识到这是一个 old/stale 问题,但本着“The Wisdom of the Ancients”的精神。)
我遇到这个问题是因为我遇到了完全相同的问题。我意识到我使用了错误的服务器来收听。您应该使用 HTTP 模块而不是 Express。
const setServer = require('http').Server(server);
const io = require('socket.io')(setServer)
所以,这部分...
server.listen(port, err => {
if (err) throw err;
console.log(`> Ready on http://heroku:${port}`)
})
...应该变成:
setServer.listen(port, err => {
if (err) throw err;
console.log(`> Ready on http://heroku:${port}`)
})