Socket.io问题分析

广播数据

如何向所有的客户端广播数据?

  1. 使用io.sockets.emit
1
2
3
4
5
6
7
...

var io = require('socket.io')(server);
io.on('connection', function(socket){
io.sockets.emit('new', {hello: 'world'});
});

  1. 使用socket.broadcast.emit
1
2
3
4
5
6
7
...

var io = require('socket.io')(server);
io.on('connection', function(socket){
socket.broadcast.emit('new', {hello: 'world'});
});

两种方式区别io.sockets.emit向所有连接的客户端广播数据,而socket.broadcast.emit则向
除了该socket自身之外的其他所有广播数据。其实也就是说
io.sockets.emit = socket.broadcast.emit + socket.emit

因此可以猜测出socket.io内部会保留所有连接的socket。

nodejs mongodb

记录一下nodejs配置mongodb的过程:

  1. mac上安装mongodb:

    1
    brew install mongodb
  2. 创建一个存在数据目录

    1
    mkdir -p ~/data/db
  3. 在用户根目录运行mongodb,指定数据存在路径为刚刚新建的目录

    1
    mongod --dbpath=./data/db

    阅读更多

网页代理

前端开发时,经常需要用代理工具Charles或者Fiddler来抓包,或修改接口或替换文件或查看提交数据等,都是非常方便。尤其是做移动端开发时,是不是经常得配置host,或者查看页面请求的数据是否正确,相信我,此时使用Charles的远程代理是一件很幸福的事情。

当我们打开浏览器请求一个页面时候,为什么Charles就能捕获到请求?然而如果chrome使用了SwitchyOmega(配合shadowsocks,翻墙神器)或者类似的代理插件,此时Charles时捕获不到我们发的请求。

阅读更多

nodejs使用shebang

基本含义

shebang也可以称之为hashbang, 代指#!。一般出现在脚本的第一行,用于在unix系统或类unix系统中指定默认的脚本文件的解释程序。
其语法格式是:

#!interpreter [optional-arg] // 解释程序的绝对路径和可选参数

  1. 如果脚本文件中没有#!这一行,执行时会以系统默认的解释程序允许
  2. 如果#!之后的解释程序是一个可执行文件,那么执行这个脚本时,它就会把文件名及其参数一起作为参数传给那个解释程序去执行。

阅读更多

nodejs web应用代码热更新

在用nodejs开发web程序过程中, 每次修改都需要重新启动一下服务, 虽然有pm2,forever等解决方案。
在fex上看见一个比较另类的解决方案——Node.js Web应用代码热更新的另类思路

在这里简单实现一下来解决开发过程中热启动的问题。

首先需要重新包装一下nodejs提供的require方法。在require自己写的代码时,同时需要监听文件变化,当文件发生变化时,重新加载模块。

阅读更多

event那些事

遇到一个问题:

A标签跳转前需要做一下登录判断,如果未登录则不让跳转,使用preventDefault发现阻止不了A标签的跳转。

解决方法:

加上stopImmediatePropagation才行。当然也可以把A标签的href属性设置为空,通过js来控制跳转,但改动略大些,忽视。

于是正好借此机会整理和收集一下JavaScript中的event事件。

阅读更多

React-Todo示例

近两天事情较少,准备做一个书单列表,初始阶段和之前看过的Todo基本相似。正好很久没看React,感觉好生疏,准备结合ES6重新写一个React的Todo示例。参考的源码和样式来源于todomvc

阅读更多