我正在使用socket-io构建一个聊天应用程序。我有很多自定义事件,对于每个事件,我想传递不同的中间件功能?在我的例子中,io.use(somefunction())不起作用!我想将中间件函数传递给这样的自定义事件?io.on('my-custom-event', middleware, function() { ... })。
套接字-io路由代码: (路径: /routes/user.js)
module.exports.user_status_info = function (io,socket) {
socket.on('custom-event', io.use(require('../../middleware/_chat-validation-middlewares/custom-event').validate(io,socket)), function (data, callback) { ... }
}中间件: (路径:/中间件/自定义事件.)
module.exports.validate = function (io,socket) {
io.use((socket, next) => {
console.log("I AM A MIDDLEWARE...")
next();
}); }当我试图在路由管道中传递中间件时,
当前实现抛出错误。
发布于 2020-12-04 08:55:56
您可以使用如下内容:您不必在套接字对象上使用数据,而只能在特定事件上使用数据。
服务器:
io.use(async (socket, next) => {
try {
const token = socket.handshake.query.token;
const payload = await jwt.verify(token, process.env.SECRET_KEY);
socket.userId = payload.id;
socket.name = payload.username;
console.log({ socketisd: socket.userId, name: socket.name });
next();
} catch (err) { }
});然后,只需使用套接字对象,稍后获取所需的所有数据。
客户:
const [socket, setSocket] = React.useState(null);
const setupSocket = () => {
const token = sessionStorage.getItem("yourjwtToken");
if (token && !socket) {
const newSocket = io("/", {
query: {
token,
},
path: '/socket'//if you have one
});
newSocket.on("disconnect", () => {
console.log("Socket disconnect");
});
newSocket.on("connect", () => {
console.log("Socket Connected");
});
setSocket(newSocket);
}
};
React.useEffect(() => {
if (currentUser && !socket) setupSocket();
//eslint-disable-next-line
}, [socket]);https://stackoverflow.com/questions/65103200
复制相似问题