Nodejs学习第二天

作者: _palm | 来源:发表于2016-10-11 00:50 被阅读123次

    今天开始学习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的学习到这里就结束啦,#-_- 晚安! 以上内容如有发现错误一定请各位朋友指出,非常感谢!

    相关文章

      网友评论

      本文标题:Nodejs学习第二天

      本文链接:https://www.haomeiwen.com/subject/zwbvyttx.html