身份验证差异

Socket.io 现使用中间器件

可以通过io.use()为socket.io服务器提供任意函数,该函数在创建socket时运行。查看此示例:

  1. const srv=require('http').createServer();
  2. const io = require('socket.io')(srv)
  3. let run=0;
  4. io.use((socket,next)=>{
  5. run++; //0->1
  6. next()
  7. });
  8. io.use((socket,next)=>{
  9. run++;// 1->2
  10. next();
  11. })
  12. const socket=require('socket.io-client')();
  13. socket.io('connect',()=>{
  14. // run 此时等于2
  15. })

现通过中间件进行身份验证更简单

旧的io.set()io.get()已弃用,只能支持向后兼容。下面是一个将旧的授权示例转换为中间件样式的转换:

  1. io.set('authorization',(handshakeData,callback)=>{
  2. //确保握手数据看起来不错
  3. callback(null,true)//出错,'authorized' boolean second
  4. })

新的:

  1. io.use((socket,next)=>{
  2. const handshakeData= socket.request;
  3. // 确保握手数据看起来和以前一样好
  4. // 如果错误,则执行这个:
  5. // next(new Error('not authorized'));
  6. // 否则回调next
  7. next();
  8. })

命名空间授权?

  1. io.of('/namespace').use((socket,next)=>{
  2. const handshakeData= socket.request;
  3. next()
  4. })