1、构建一个web服务器

  以前玩php和jsp时用过Apache、汤姆猫服务器,nodejs则有不同,他是需要自己createServer。

  

//server.js
var http = require('http'); http.createServer(function(req,res){
res.writeHead(200,{'Content-Type':'text/plain'});
res.end('so easy!');
}).listen(1111,'127.0.0.1'); console.log('server runing at 127.0.0.1:1111...');

  在浏览器访问127.0.0.1:1111可以看到so easy!字样。

  这里用到的时http模块到createServer方法,node的模块有三种,自有模块,npm模块,文件模块。自有模块直接用require,不带路径;npm模块先要npm install, 然后像自有模块那样引入;文件模块就是自己创建到模块,要带路径引入。

  2、从请求对象中获取东西

  上面到req是一个请求对象,包含了请求相关到信息,可以console.log出来看看,比较多,这里简单介绍。

  (1)req.url

  访问http://127.0.0.1:1111其值为/

  访问http://127.0.0.1:1111/index/index.html?a=1#fd其值为/index/index.html?a=1(注意这里没有hash)

  一般的,用url模块解析其路径,用querystring模块解析其查询参数,当然自己去分解字符串也是可以的。

  3、作出响应

  1中到res是http.ClientRequest 类的一个实例,他有很多方法。这里介绍两个。

  (1)writeHead(status,{'key':value});这个方法用于写响应header头。

  

var http = require('http');

http.createServer(function(req,res){
res.writeHead(200,{'Content-Type':'text/html'});
res.end("<html><head><meta charset='utf-8'></head><body><h2>欢迎关注大~熊</h2></body></html>");
}).listen(1111,'127.0.0.1'); console.log('server runing at 127.0.0.1:1111...');

  如果这样写,得到的响应的head中Content-Type就是text/html,响应数据作为html代码被解析。

  (2)end()

   上面到这个例子已经用到这个方法,作用是将数据写到响应报文的数据段。

  4、读写文件

  读写文件用到的时fs模块。

  (1)读文件

    fs.readFile(file[, options], callback):异步读文件,回调函数有两个参数,第一个错误信息,第二个是读到的数据。数据可能是一个buffer,也可能是一个字符串。取决于options中到encoding

    fs.readFileSync(file[, options]):同步读文件,返回读到到数据

    具体可以看看文档说明,关于同步和异步,大~熊理解不太深入,也经常因为这个犯错。同步是一种阻塞式的,必须读完了后边的事才可以做,异步非阻塞的,一件事没干完后边的事就可以做。

    我在项目根目录下建了一个1.txt文件,内容为“欢迎关注大~熊”;   

var fs = require('fs');

console.log(fs.readFileSync(__dirname+'/1.txt','utf8'));  //指定了encoding
//欢迎关注大~熊

  

var fs = require('fs');

console.log(fs.readFileSync(__dirname+'/1.txt'));     //没有指定encoding
//<Buffer e6 ac a2 e8 bf 8e e5 85 b3 e6 b3 a8 e5 a4 a7 ef bd 9e e7 86 8a>

  异步方法是类似的

var fs = require('fs');

fs.readFile(__dirname+"/1.txt",'utf8',function(err,data){
console.log(data);
})

  (2)写文件

    fs.writeFile(file, data[, options], callback),异步api,data可以是buffer也可以时String

    fs.writeFileSync(file, data[, options]),同步api

    

var fs = require('fs');

fs.writeFileSync(__dirname+'/1.txt','大熊真帅!','utf8');

  可以看到文件内容变成了‘大熊真帅!“.

  5、node-xlsx模块和socket.io模块

  前者是帮助我们处理excel表的,请参看https://github.com/mgcrea/node-xlsx

  后者时封装了实时通信的api,请参看https://github.com/socketio/socket.io

二、在线填表应用开发篇

  1、完成效果

  

  这里在录制gif时还存在一个问题,就是a用户修改某一行中,b用户中不会立即显示更改后的数据,现已经改正,原来的时单播事件,改成广播就好了。原计划将代码都贴出来分析分析,但是考虑到放一大段代码似乎不太好,所以将其放到了github上https://github.com/yibingxiong/onlinetable/ ,下面只简单讲一下思路,如果你需要看看源码可以clone,我的github目前没有star,如果你能成为第一个star,大~熊非常高兴。

  2、基本思路

  (1)用户初次链接时向服务器发送一个connectin事件,这个事件是调用io()方法自动发送给服务器的,无需主动调用,服务器接受到这个事件后读取excel文件,并用nodex-xlsx解析,然后调用自定义的一个changeStatus方法,这个方法时根据正在被修改的行的数组isOptRows(这个数组是所有用户共享的,存储正在被修改的行到行号)为每一行增加一个标识,0表示没人在修改,1表示有人在修改。处理完成后向客户端单播一个serverChange事件,同时携带处理后的数据,客户端根据这些数据渲染出表格,将状态为0的行置于可编辑状态,状态为1的行置于不可编辑状态。

  (2)用户点击编辑时,向服务器发送一个enter事件,携带的数据为被编辑的行号。然后将该行数据变成编辑状态,就是变成文本框,按钮变成完成。服务器收到enter事件后,取得其中的行号,加入到isOptRows数组,然后广播一个事件broadcast,携带上行号,告知所有用户"这个行有人在编辑,你不要编辑了",客户端收到这个事件,将这一行变成不可编辑状态。

  (3)用户点击完成后向服务器发送一个datachange事件,携带上修改后到新数据,同时将这一行变成正常状态。服务器收到datachange事件后,将对应行的数据更新,写回到文件。写完后发一个serverChange事件,携带上新的数据。同时从isOptRows中溢出完成修改的行的行号。

  (4)思路总结一下,实现还是比较的简单,不过用这个例子还是可以学习下如何进行实时通信,socket.io其实就是在服务器和客户端建立了一个交流的通路。如果将服务器看作领导,客户端看作员工,可以理解为领导可向单个员工发出指令(单播),也可以开个员工大会,向所用员工发出指令(广播),反过来,员工也可以向领导反映情况。

三、谈谈入门nodejs的感受

  javascript是个奇葩,nodejs更是一个奇葩。javascript里边可以一个函数里边套一个函数,他的继承是基于原型的,他的数组时动态变化的......而nodejs将这门奇葩到语言搬到了服务端,奇葩归奇葩,但是发自内心的说,他们非常灵活,也比较好玩。

  关于nodejs适合io密集什么的我不懂,但是感觉入门还是比较容易的,我看的是清华出版到Node.js开发实战详解(不得不吐槽:这本书的错误真多),两三天就入门了。看了下后面的章节,感觉后边难度会有所加大,不过万物都是相通的,他和其他的比如php之类的还是会有很多共性的。

  不得不提一下jade(现在叫pug)提供的模板引擎,他将我们美丽的html搞成了那个样子确实让人很不适应啊,相比之下更喜欢ejs这个模板引擎,发现他jsp长得好像啊,好像遇到旧友一般。

  刚入门nodejs,关于文中的一些错误和不当之处还请各位园友多多批评指正。最后,如果你喜欢半血的话,请关注他。 

nodeJS实现一个在线填表应用的更多相关文章

  1. 用nodejs搭建一个简单的服务器

    使用nodejs搭建一个简单的服务器 nodejs优点:性能高(读写文件) 数据操作能力强 官网:www.nodejs.org 验证是否安装成功:cmd命令行中输入node -v 如果显示版本号表示安 ...

  2. 05传智_jbpm与OA项目_部门模块中增加部门的jsp页面增加一个在线编辑器功能

    这篇文章讲的是在线编辑器功能,之前的部门模块中,增加部门的功能jsp页面起先是这么做的.

  3. 从零开始,在windows上用nodejs搭建一个静态文件服务器

    从零开始,在windows上用nodejs搭建一个静态文件服务器 首先安装nodejs: 新建一个node文件夹 下载node.exe到该文件夹 下载npm然后解压到该文件夹 现在node文件夹是这样 ...

  4. 用nodejs搭建一个简单的服务监听程序

    作为一个从业三年左右的,并且从事过半年左右PHP开发工作的前端,对于后台,尤其是对以js语言进行开发的nodejs,那是比较有兴趣的,虽然本身并没有接触过相关的工作,只是自己私下做的一下小实验,但是还 ...

  5. J2EE用监听器实现同一用户只能有一个在线

    这里我们讨论的是已登陆或将要登陆的用户,游客不在讨论的范围之内.这一点大家应该很容易就能理解的吧.                那么我们应该怎样去实现同一用户只能有一个在线这样的一个小功能呢? 有人 ...

  6. 推荐一个在线json数据格式化网站

    json数据非常友好方便的处理: 推荐一个在线json数据格式化网站 http://json.parser.online.fr/

  7. 用nodejs做一个svn密码修改页面

    linux上配置好svn服务后,管理修改密码还得去手工修改passwd这个文件,略麻烦,其实网上应该有配套的web管理修改界面程序.但我想自己用nodejs写一个,因为用node不用配置复杂的服务器. ...

  8. 构建一个在线ASCII视频流服务

    构建一个在线ASCII视频流服务 2018-03-26  正常的文章 1685 什么是ASCII视频流服务? 其实这个名字是咱胡乱起的,具体叫啥我也不清楚,但效果如下: 大家可以在自己的命令行里试下, ...

  9. 用 nodejs 写一个命令行工具 :创建 react 组件的命令行工具

    用 nodejs 写一个命令行工具 :创建 react 组件的命令行工具 前言 上周,同事抱怨说 react 怎么不能像 angular 那样,使用命令行工具来生成一个组件.对呀,平时工作时,想要创建 ...

随机推荐

  1. Bootice1.34版本把grub4dos0.46a写入硬盘MBR失败一个例子

    Bootice1.34版本把grub4dos0.46a写入硬盘MBR失败一个例子         一个同事的台式机,BIOS启动,500GB硬盘,分了四个MBR分区,C盘是激活的主分区,第二个分区50 ...

  2. bzoj5048: 塌陷的牧场

    Description 农夫小Q将他的奶牛们饲养在一个长n宽m的矩形网格牧场中.行从上到下依次编号为1到n,列从左往右依次编号为1 到m.为了防止奶牛们逃跑,小Q在牧场外圈安装了一排电网,只要奶牛走出 ...

  3. Windows10右键添加"在此处打开命令窗口"

    添加注册表: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Directory\shell\OpenCmdHere] @=" ...

  4. ijkplayer总结

    12.ijkplayer的使用过程: 11.ijkpalyer引言: ==== 12.ijkplayer的使用过程: >>举例mac系统编译.so文件:   ijkplayer默认是不支持 ...

  5. sas 获取数据集观测数量

    DATA _NULL_;SET SASHELP.CLASS NOBS=N;CALL SYMPUTX('N',N);STOP;RUN; %PUT N=&N.; 运行结果: 57 DATA _NU ...

  6. java为什么不能根据返回值重载?

    我以前对Java中为什么不能根据返回值进行重载,而只能根据方法的参数进行重载非常不理解.比如void f(){}和int f(){},虽然他们有同样的名字,但是很容易区分.如果我这样做,肯定是没问题的 ...

  7. npm镜像地址的修改或切换

    方法一:直接编辑npm的配置文件npm config edit修改registry的地址registry=https://registry.npm.taobao.org 方法二:用代码更改npm的配置 ...

  8. Spring 中 Bean 的生命周期

    所谓 Bean 的生命周期,就是一个 Bean 从创建到销毁,所经历的各种方法调用.大致包含下面几个方法(不是全部) Bean 的实例化,调用了构造方法. 使用 setter 方法填充属性. 一旦依赖 ...

  9. getColor问题

    getResource.getColor(R.color.color_name) 过时了,可以使用新加入的方法 ContextCompat.getColor(context, R.color.colo ...

  10. CentOS下安装Docker-CE

    1.安装最新版本的话可以使用阿里云的自动安装脚本: curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 2.安装指定的 ...