Nodejs学习第二天

今天开始学习Nodejs官网提供api(一般称这为模块)练习,类似java JDK, 根据第一天代码:

 //导入 http模块
 var http = require('http');
 //创建一个httpServer 并监听8081端口
 http.createServer(function (req, res) {
//响应客户端请求,并输出信息 --> Hello, World.
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.write('Hello, World.');
  res.end(); //结束本次请求
 }).listen(8081);

以上是一个很简单的web程序,提供了从服务器端到应用端的全部流程,这里的业务逻辑非常简单,只是向页面输出字符串 Hello, World. .

接下来,根据我学习后的理解全手动编写了如下代码(#-_-),稍微能处理来自不同的请求,类似java # DispatcherServlet :

首先,先定义程序的入口,虽然js没有main函数, 新建一个index.js, 先不计划编码任何代码。
然后,新建server.js,用来存放第一天学习的部分内容,就像文件名一样,是一个类似server的功能,代码如下:

 //导入http 和 url模块 类似java的 Map\\\\List等工具类
var http = require('http'),
    url = require('url') ;
 function start() {
  //请求处理函数,就是第一天学习的箭头函数,这里不再是一个匿名函数
  function onRequest(req,res) {
   //这里通过url模块提供函数 parse获得请求方法,详细可以参考node官方网站document说明
   var pathName = url.parse(req.url).pathname ;
   console.log('request path ',pathName) ;
   //响应状态码 和格式
   res.writeHead(200,{'Content-Type':'text/plain'}) ;

   res.write('Hello,World.') ;
   res.end() ;
  }

  http.createServer(onRequest).listen(8081) ;
  console.log('server has started.') ;
 }

 //将函数start函数导出为一个模块
 //export
 exports.start = start ;

然后回到index.js中 编写如下代码:

//导入刚才我们编写的server模块
 var server = require('./server') ;

//调用模块提供server功能
 server.start() ;

然后可以运行如下命令:

node index.js

访问http://localhost:8081 ,可以看到输出。

上面代码将业务逻辑放到了 server中,在实际工作中,这明显是非常不合理的,因为业务逻辑变更比女人翻脸还快,放到server中后果可想而知。这里需要调整,记得在刚开始学习java #servlet 的时候,我们最开始是使用get方式将方法传递到服务器端,然后通过永远也写不完的if....else if.... else if.... 来进行不同功能的分发,这里如果提供一个类似路由表的东西就可以达到类似的目的,由于javaScript对象是key-value的形式出现,这给这一功能提供了方便,例如:

var handle = {} ;
handle['/'] = root ; //代表访问项目首页
handle['/start'] = start ; //代表访问项目首页
handle['/upload'] = upload ; //代表上传文件请求

这样,不同的功能类似一张路由表被关联起来了,例如:

//dispatcher.js
 function start() {
  console.log('call /start') ;

  return 'call /start' ;
 }

 function upload() {
  console.log('call /upload') ;
  return 'call /upload' ;
 }

 function root() {
  console.log('call /') ;
  return 'call /' ;
 }

 exports.start = start ;
 exports.upload = upload ;
 exports.root = root ;

以上代码表示不同需求的功能函数。然后再提供一个路由转发功能的模块,例如:

//router.js
 function route(path,handle) {
  console.log('route path ',path) ;

  var fun = handle[path] ;
  if(typeof fun === "function") {
   return fun.call(null,arguments) ;
  }else {
   console.log('unknown path.') ;
   return 'unknown path.' ;
  }
 }

 exports.route = route ;

然后我们需要对index.jsserver.js 中的代码进行适当的修改,如下:

server.js

//server.js
 //导入http 和 url模块 类似java的 Map\\\\List等工具类
var http = require('http'),
    url = require('url') ;
 //服务启动需要传递两个参数,handle为转发提供映射表,route执行转发
function start(handle,route) {
  //请求处理函数,就是第一天学习的箭头函数,这里不再是一个匿名函数
  function onRequest(req,res) {
   //这里通过url模块提供函数 parse获得请求路径,详细可以参考node官方网站document说明
   var pathName = url.parse(req.url).pathname ;
   console.log('request path ',pathName) ;
   //响应状态码 和格式
   res.writeHead(200,{'Content-Type':'text/plain'}) ;
  //使用route 模块进行转发请求,这里为了能看到明显的效果,将不同功能信息输出到页面
   //dispatcher
   var content = route(pathName,handle) ;
   console.log('return content',content) ;

   res.write(content) ;
   //res.write('Hello,World.') ;
   res.end() ;
  }

  http.createServer(onRequest).listen(8081) ;
  console.log('server has started.') ;
 }

 //将函数start函数导出为一个模块
 //export
 exports.start = start ;

index.js

//index.js

 var server = require('./server'),
     router = require('./router'),
     dispatcher = require('./dispatcher');

 var handle = {} ;
 handle['/'] = dispatcher.root ;
 handle['/start'] = dispatcher.start ;
 handle['/upload'] = dispatcher.upload ;
 server.start(handle,router.route) ;

运行 node index.js ,并访问映射路径可以看到不同的输出信息, 例如: http://localhost:8081/upload // call /upload

至此,第二天nodejs的学习到这里就结束啦,#-_- 晚安! 以上内容如有发现错误一定请各位朋友指出,非常感谢!

    原文作者:_palm
    原文地址: https://www.jianshu.com/p/43632ba1df06
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞