首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Migration from 0.9

对于大多数应用程序,过渡到1.0应该完全无缝并且没有任何问题。也就是说,我们已经完成了一些精简一些API的工作,并且我们更改了一些内部消息,所以这是大多数现有用户的推荐阅读。

认证的区别

Socket.io 现在使用中间件了

您可以通过io.use()创建套接字时运行的Socket.io服务器提供任意函数。看看这个例子:

代码语言:javascript
复制
var srv = require('http').createServer();
var io = require('socket.io')(srv);
var run = 0;
io.use(function(socket, next){
  run++; // 0 -> 1
  next();
});
io.use(function(socket, next) {
  run++; // 1 -> 2
  next();
});
var socket = require('socket.io-client')();
socket.on('connect', function(){
  // run == 2 at this time
});

… 现在应该使用中间件来进行认证

旧的io.set()io.get()方法已被弃用,仅支持向后兼容。这是将旧的授权示例转换为中间件样式的。

代码语言:javascript
复制
io.set('authorization', function (handshakeData, callback) {
  // make sure the handshake data looks good
  callback(null, true); // error first, 'authorized' boolean second 
});

对比一下

代码语言:javascript
复制
io.use(function(socket, next) {
  var handshakeData = socket.request;
  // make sure the handshake data looks good as before
  // if error do this:
    // next(new Error('not authorized');
  // else just call next
  next();
});

命名空间认证?

代码语言:javascript
复制
io.of('/namespace').use(function(socket, next) {
  var handshakeData = socket.request;
  next();
});

日志的区别

日志现在基于调试

要打印所有调试日志记录,请将环境变量DEBUG设置为*。即:DEBUG=* node index.js

仅打印与socket.io相关的日志记录:DEBUG=socket.io:* node index.js

仅从套接字对象打印日志记录:DEBUG=socket.io:socket node index.js

在这一点上,这种模式应该很有意义。socket.io/lib中的文件名称与它们的调试名称相同。

调试也适用于浏览器; 日志被坚持到本地存储。要使用:打开开发人员控制台并键入localStorage.debug = 'socket.io:*'(或任何调试级别),然后刷新页面。一切都会被记录,直到你跑localStorage.debug = ''

请参阅此处的调试文档。

快捷方式

总的来说,常见的东西有一些新的捷径。旧版本仍然可以工作,但快捷键很好。

在默认命名空间中广播给所有客户端

之前:

代码语言:javascript
复制
io.sockets.emit('eventname', 'eventdata');

现在:

代码语言:javascript
复制
io.emit('eventname', 'eventdata');

请注意,在这两种情况下,这些消息都会连接到连接到默认“/”名称空间的所有客户端,而不是其他名称空间中的客户端。

启动服务器

之前:

代码语言:javascript
复制
var io = require('socket.io');
var socket = io.listen(80, { /* options */ });

现在:

代码语言:javascript
复制
var io = require('socket.io');
var socket = io({ /* options */ });

配置差异

io.set 被移除了

相反,请在服务器初始化中进行配置

代码语言:javascript
复制
var socket = require('socket.io')({
  // options go here
});

像日志级别的选项已经消失。io.set('transports')io.set('heartbeat interval')io.set('heartbeat timeout',和io.set('resource')仍然支持向后兼容性。

设置资源路径

上一个resource选项等同于新path选项,但/在开始时需要一个选项。例如,以下配置

代码语言:javascript
复制
var socket = io.connect('localhost:3000', {
  'resource': 'path/to/socket.io';
});

变为:

代码语言:javascript
复制
var socket = io.connect('localhost:3000', {
  'path': '/path/to/socket.io';
});

解析器 / 协议的区别

这只与更新诸如其他语言的socket.io实现,自定义的socket.io客户端等相关。

区别 1 – packet 编码

解析现在是基于类和异步的。编码使用一个编码数组作为唯一参数来调用回调,而不是返回单个编码字符串。每个编码应按顺序写入传输。这是更灵活的,使二进制数据传输工作。这是一个例子:

代码语言:javascript
复制
var encoding = parser.encode(packet);
console.log(encoding); // fully encoded packet

对比一下:

代码语言:javascript
复制
var encoder = new parser.Encoder();
encoder.encode(packet, function(encodings) {
  for (var i = 0; i < encodings.length; i++) {
    console.log(encodings[i]); // encoded parts of the packet
  }
});

区别 2 – packet 解码

解码需要更进一步,并且是基于事件的。这是因为一些对象(包含二进制)被编码和解码成多个部分。这个例子应该有助于:

代码语言:javascript
复制
var packet = parser.decode(decoding);
console.log(packet); // formed socket.io packet to handle

对比:

代码语言:javascript
复制
var decoder = new parser.Decoder();
decoder.on('decoded', function(packet) {
  console.log(packet); // formed socket.io packet to handle
});
decoder.add(encodings[0]); // say encodings is array of two encodings received from transport
decoder.add(encodings[1]); // after adding the last element, 'decoded' is emitted from decoder

扫码关注腾讯云开发者

领取腾讯云代金券