如何将 Socket.io 与 Next.js API 路由一起使用 [英] How to use Socket.io with Next.js API Routes
问题描述
Next.js 提供无服务器 API 路由.通过在 ./pages/api
下创建一个文件,你可以让你的服务运行,我想通过使用这种机制来拥有一个 Socket.io 服务.
Next.js provides serverless API routes. By creating a file under ./pages/api
you can have your service running, and I want to have a Socket.io service by using this mechanism.
我创建了一个客户端:
./pages/client.js
import { useEffect } from 'react';
import io from 'socket.io-client';
export default () => {
useEffect(() => {
io('http://localhost:3000', { path: '/api/filename' });
}, []);
return <h1>Socket.io</h1>;
}
还有一个 API 路由:
And an API route:
./pages/api/filename.js
const io = require('socket.io')({ path: '/api/filename' });
io.onconnection = () => {
console.log('onconnection');
}
io.on('connect', () => {
console.log('connect');
})
io.on('connection', () => {
console.log('connection');
})
export default (req, res) => {
console.log('endpoint');
}
但是我无法让客户端连接到 Socket.io 服务器并成功看到以下任何内容:'onconnection'
、'connect'
或 'connection'
打印出来.
But I can't get the client to connect to the Socket.io server and succesfully see any of: 'onconnection'
, 'connect'
, or 'connection'
printed.
推荐答案
诀窍是只将 'socket.io' 插入 http 服务器一次,因此检查对 api 的每次访问.尝试这样的事情:
The trick is to plug 'socket.io' into the http server only once, so checking every access to the api. Try something like this:
./pages/api/socketio.js
import { Server } from 'socket.io'
const ioHandler = (req, res) => {
if (!res.socket.server.io) {
console.log('*First use, starting socket.io')
const io = new Server(res.socket.server)
io.on('connection', socket => {
socket.broadcast.emit('a user connected')
socket.on('hello', msg => {
socket.emit('hello', 'world!')
})
})
res.socket.server.io = io
} else {
console.log('socket.io already running')
}
res.end()
}
export const config = {
api: {
bodyParser: false
}
}
export default ioHandler
./pages/socketio.jsx
import { useEffect } from 'react'
import io from 'socket.io-client'
export default () => {
useEffect(() => {
fetch('/api/socketio').finally(() => {
const socket = io()
socket.on('connect', () => {
console.log('connect')
socket.emit('hello')
})
socket.on('hello', data => {
console.log('hello', data)
})
socket.on('a user connected', () => {
console.log('a user connected')
})
socket.on('disconnect', () => {
console.log('disconnect')
})
})
}, []) // Added [] as useEffect filter so it will be executed only once, when component is mounted
return <h1>Socket.io</h1>
}
这篇关于如何将 Socket.io 与 Next.js API 路由一起使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!