node.js开发环境搭配&请求响应实现原理

node:用于服务器端编码,相当于java或者php

express:一种node的框架,相当于java是ssh三大框架或者php的Laravel、Laravel、Symfony2等框架。

mongoDB:一种数据库,相当于MySQL、SQL Server、ORACLE等。

npm:包管理器,相当于php.ini管理到底引不引入某个模块一样(PHP默认mysql模块也是被注释掉的),npm的主要作用是发布包、更新发布的包、取消发布的包、安装其他模块这四个功能。

第一步:安装node环境(相当于开发javaWeb的jdk环境)

  • 去官网(http://nodejs.org/)下载安装文件(和你下java的jdk差不多),其中要下哪个嘛,我解释下:node.js开发环境搭配&请求响应实现原理

    msi文件里面包含了npm模块,exe文件里面没有包含npm模块到时需要自个安装,Source Code是源码大神看的东西(好比windows的源码或者java那个jdk的源码),这个个人建议下msi那个,因为npm是必须要的模块。(PS:.tar.gz是压缩文件,和windows下的.rar或者.zip文件一样)

  • 下载后安装(像装QQ一样,别说你不会装QQ~~~)

  • 假如你下的是msi那个,安装后会自动帮你把node命令添加到系统环境变量中(exe那个要手动添加),接下来打开命令行窗口输入:node -v(任何目录下输入都行,因为node命令已经加入到了系统环境变量了嘛),就会显示版本号。

  • 到此,node环境安装成功。其实现在你可以写一些单机的js(比如建个test.js的文件,里面就写一句console.log("hehe");),然后在命令行窗口中切换到js文件的目录,然后使用node命令运行js文件了(node test.js)。但是还没搭建完前后台以及数据库整套环境,相当于javaWeb项目你刚安装完jdk,仅可以运行一些java文件而已;也相当于配置PHP的web环境搭建,刚去官网下载了PHP压缩包解压后,并把php.exe的路径添加到环境变量这一步,你一样是可以解析php文件了。至于怎么获取前台传过来的数据,怎么响应前台的请求,怎么连接数据库,怎么配置整个站点,往下看。。。

    PS:假如你不需要复杂的功能(好比javaweb不用框架可以自己写servlet和各种过滤器等,好比PHP自己手动写代码处理各种请求/数据和安全防范),不需要数据库,到此即可。


第二步:配web环境

  • 既然是web,那么最关心的是怎么获取get和post请求的数据,然后回应请求。这就需要用到node的核心模块之一(http模块)了,这个模块是自带的(就像java/PHP自带的系统函数一样)。

  • 先演示获取get请求的数据:

    新建一个文件啥名字都可以,例如就叫getTest.js吧~~~

//文件getTest.js

//以下三个模块都是node自带的,不用安装
//引入http模块,相当于http服务器,用于接收到请求&返回相应
var http = require('http');
//引入url模块用于获取get请求的数据,大家都知道,get请求携带数据就是在url后面附参而已,node获取的原理就是拿到这个完整的url然后做字符串截断,得到后面的参数和值。
var url = require('url');
//引入util模块,用于把对象转化为字符串,方便输出看到结果(呵呵,为了给大伙演示结果才用的哦,非必要)
var util = require('util');

http.createServer(function(req,res){
  res.writeHead(200,{'Content-type:'text/plain''});  //res即response响应,这里声明响应的头部信息(不写会默认一个头部信息)
  res.write(util.inspect(url.parse(req.url,true)));  //响应的信息主体
  res.end();  //声明响应结束,可以返回给前台了(没有这个结束标志的话,响应是不会发出去的)
}).listen(8888);  //监听http://localhost:8888(因为在本地测试,所以是localhost)

//解释并运行:node getTest.js
//浏览器里访问:http://localhost:8888/test?id=1&name=zhangsan
//返回的结果打印出来是这样的:(里面的值只是举例子,别死磕哦~)
{
search: '?id=1&name=zhangsan',
query: {id:1,name:'zhangsan'},
pathname: '/test',
path: '/test?id=1&name=zhangsan',
href: '/test?id=1&name=zhangsan'
}

      代码解释: 

url.parse(req.url,true)

      是在获取request请求完整的url(因为get请求的数据都在url里带过来的嘛),然后用util.inspect()方法将对象转换为字符串写入到返回去的响应主体信息中

      豁然开朗了吧~~~node里没有像PHP那样$_GET['id']这么方便的做法(其实PHP只是把这些操作都封装好了而已,底层大家都一样),node帮你拿到get请求的完整url,然后自个对url字符串进行截断获取需要的数据。

  • 再演示获取post请求的数据:

    新建一个文件啥名字都可以,例如就叫postTest.js吧~~~

//文件postTest.js

var http = require('http');
var util = require('util');
var querystring = require('querystring');  //用于将字符串转换为POST的请求格式

http.createServer(function(req,res){
  var postString = '';   //用于存放post数据
  req.on('data',function(chunk){
      postString +=chunk;  //把分段的数据拼接成一个字符串
  });
  req.on('end',function(){
      postString = querystring.parse(postString);  //把拼接好的数据转换为POST请求本来的格式
      res.end(util.inspect(postString));  //响应头和主体省略了
  });
}).listen(8888);  //监听
 
//需要测试的话,在写个html页面,里面放个form表单来提交,action = 'http://localhost:8888/postTest.js'

      代码解释:

req.on()

      这个函数是监听request请求中的POST请求,当第一个参数是data时表示有POST数据传过来。因为数据可能很大(比如上传文件/图片/音视频等),所以一个POST请求会分N多次发送到服务器端,我们就用字符串拼接的方式把传过来的数据拼接起来。传输完毕时,会跳到参数为end监听中,然后用querystring.parse()把刚才拼接起来的字符串还原为POST请求的数据(假如数据本来是字符串则没变化,假如是文件/图片等数据,就必须还原为文件/图片,不是吗?),最后照样把数据强行转换为字符串响应回去。

      警告:在真正的项目中,是不可能这样处理POST请求的。原因一,这样手动处理的话,太繁琐,你会果断弃node选PHP。原因二,这样做有严重的效率和安全问题。原因三,所有的node框架都把处理POST请求的方法封装好了,你要是这样处理能把效率和安全性的问题解决了,就等于做了一个框架(大神的话,请忽略原因三)。

      处理POST请求的原理是这样的,但是在实际应用中我们都会使用框架来处理(比如稍后介绍的express框架,node官方唯一推荐的框架,没有之一哦),因为框架已经帮我们把这些方法封装好,并做了效率和安全性方面的优化。

  • 至此,做一个简单的web应用是没什么问题的,但是有些复杂点的常用知识点还没提到,比如上传文件怎么处理、回话级别处理、cookie处理等。呵呵,别急,接下来要把数据存入数据库,管理回话(传说中的session)等, 文件和代码都会越来越多~~~是不是该归类或者抽取出来封装好呀(好比java和PHP等一样封装成类),但是node没有类,却有模块和包~~~

    模块和包是node的一大特点,我的理解是:模块相当于类,包就和开发javaWeb项目时src下面的包一样,包中可以有多个模块(类,或者说.class文件,node是.js文件,当然你起的后缀叫.hehe也行,但是业内预定俗称的规矩还是遵循一下比较好)。npm就是这些包的管理工具,npm的功能主要是发布到node的仓库(然后大家就可以通过npm -install '包名' 这个命令来安装你发布的包了,稍后我们安装其他包都是这样安装的,包括框架express),这个有点像Eclipse装插件一样~~~当然,你是这个包的发布者,可以通过npm来管理(更新,取消发布)。

  • 总结一下:node前后端通信,http、url这两个模块是必须的(node自带的核心模块),其实现的原理是:处理get请求是通过截断url来获取数据,处理post请求是通过字符串拼接然后转换为完整的POST数据。

  • 嫌我啰嗦的~或者没看懂的~请看《Node入门》吧,此书免费在线观看版:http://www.nodebeginner.org/index-zh-cn.html


可能会出的错:

  1. 第一步中,假如你32位的系统下64位的安装包,会出错。

  2. 第一步中,假如你的系统中已经安装过了node,继续安装,会覆盖掉你以前node的config配置。

  3. 第一步中,打开命令行需要用管理员的权限打开,否则node命令无法用。

  4. 第一步中,假如你在安装过程中因突然断电或者其他不可抗拒的因素而中断了安装过程,需要卸载后重新安装,有些系统需要下载后清理注册表才能重新安装。

  5. 第一步完成后,测试js文件想看到效果,需要用console.log();输出到控制台(即命令行界面)。

  6. 第二步中,没有看到结果,可能是因为你没有在cmd命令行中执行node命令来解释和运行你的后台文件(getTest.js、postTest.js)。

  7. 测试get请求,如果使用ajax测试返回的数据,请把typeData设置为text或者html,因为返回时已经把数据转换为了字符串。

  8. 测试post请求时,假如post数据较少,res.on('data',function(){...});可能只执行了一次,要验证的话,可以在res.on('data',function(){...});中用console.log(postString);把每次传送过来的POST数据打印到控制台(假如是非字符串,比如文件等,会是二进制,console会把给二进制数据转换为字符串形式打印到控制台)。

     The end,如需深入了解,请关注我的另外一篇博客,将介绍如何用node+express框架+ejs模版+mongoDB数据库开发一个web项目:***。

你可能感兴趣的:(node.js开发环境搭配&请求响应实现原理)