$socket可以让服务器主动推送数据给客户端,实现多个在线用户之间及时传递消息
channel:频道,希望接受到哪些频道的消息。可以是字符串或数组。
onExp:事件响应表达式可包含如下选项
onConn:连接上(connect)服务器后执行的表达式。重连或订阅新频道也会再次执行。
onData:收到消息后执行的表达式。
onHeartbeat:响应心跳表达式。为了保持长连接,客户端和服务器每30秒内就会同步一次心跳。变量connected表示连接状态,date表示心跳时间,date() - date - 30000
表示断开连接多久了。
onError:发生错误后执行的表达式。
option:有若干选项
login:0:无需登录(将忽略saveToDB);1:要登录且只能有一个会话(session),多处登录会断开前面的连接;2:要登录并允许多个会话(可多端登录的同一用户能接受到相同的消息)。默认为1。
saveToDB:是否把消息保存到数据库*。
autoResend:重连后是否自动重发断连期间未能发送的消息。
online:是否响应用户上线消息,有用户上线时将收到{type: "online", session: _id, x: user_id}
offline:是否响应用户下线消息,有用户下线时将收到{type: "offline", session: _id, x: user_id}
可以发给某人(当to是用户_id时)或广播给某个频道里的所有人(当to是channel时)。用type
指定消息类型,以便onData表达式据此分类处理。x
可以是任意格式的消息详情。
此API是异步函数,不等待发送结果就执行下一表达式(因此无$r),发送结果转而由onData接收,格式如下:
{
d: Number, // 发送时间,即new Date().getTime()
from: User, // 发送人ID
session: _id, // 发送人的会话ID
to: User/String, // 接收人ID或频道名
type: String, // 消息类型type
x: Any // 消息详情x
}
typezchannel
是特殊类型,用在已打开连接要订阅新频道时,比如加入新群聊,在新群发消息前先订阅一下$socket.send(群_id, "zchannel")才能收到此群的消息。如果不想再收到此群消息则可通过$socket.send(群_id, "zchannel", -1)退订。
查询当前指定频道的在线用户。返回 { session: [], user: [], map: {} },map存放的是user及其session数组的映射关系。
* saveToDB开启后会把消息保存到type为”zsocket”的tkdb中;群聊的话它的key为频道ID,私聊的话它的key是聊天双方用下划线拼接的用户ID;x
是消息对象数组 [{ type, from, d, x }],其中d是数值格式的消息发送时间,x是消息内容。例:
查找”我的“私聊消息历史:$tkdb.find("私聊消息", { type: "zsocket", key: { $regex: $c.me._id } })
查找某个群聊消息历史:$tkdb.find("群聊消息", { type: "zsocket", key: { $in: 群ID } })
删除某人某次时间发的消息:$tkdb.update(消息ID, { $pull: { x: { from, d } } })
删除整个聊天消息:$tkdb.delete(消息ID)
由于后端接口不一定是人触发的,不能用登录用户_id作为消息发送方,因此必须传from
参数,
另外还多了opt
选项:{ sendBack: false, cc: [] }。
sendBack:是否要给接口调用者也回发一次消息,前端是一定会回发的,后端默认不回发。
cc:抄送列表,同时也发送给其他人。