NodeJS入门笔记

in 编程
关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9

跟着Node入门学习nodeJS,小笔记

Node.JS???

Node.js 使用Google的V8虚拟机,使javaScript代码能在脱离浏览器环境的情况下运行,相当于说Node.js提供了一个可以解释并执行JS代码的环境。
Node.js 的核心是模块化,Node.js通过代码模块化简化很多重复的操作,相当于提供了一个功能强大的库

Web过程

图片描述

  1. index.js
    作为入口,引导和启动其他模块,

    var server = require("./server");
    var router = require("./router");
    var requestHandlers = require("./requestHandlers");
    var handle = {};
    handle['/'] = requestHandlers.start; 
    handle['/start'] = requestHandlers.start;
    handle['/upload'] = requestHandlers.upload;
    server.start(router.route,handle); //调用server模块提供的接口
    
  2. server.js
    使用http模块创建服务器监听端口,使用url模块解析请求,调用router模块

    var http = require("http");
    var url = require("url");
    
    function start(route, handle) {
      function onRequest(request, response) {
        var pathname = url.parse(request.url).pathname;
        route(handle, pathname,response);
        ....
      }
    
      http.createServer(onRequest).listen(8888);
      console.log("Server has started.");
    }
    exports.start = start; //提供start方法接口
    
  3. router.js
    按请求值(如 /start || /upload)调用请求处理程序

    function route(handle, pathname, response) {
      console.log("About to route a request for " + pathname);
      if (typeof handle[pathname] === 'function') {
        handle[pathname](response);
      } else {
        console.log("No request handler found for " + pathname);
        response.writeHead(404, {"Content-Type": "text/plain"});
        response.write("404 Not found");
        response.end();
      }
    }
    exports.route = route; //提供接口
    
  4. requestHandlers.js
    各种处理方法,对请求作出响应,让请求处理程序可以和浏览器进行“对话”。

    function start(){}
    function upload(){}
    exports.start = start;
    exports.upload = upload; //方法接口
    

要注意的问题

Q1.异步与同步,阻塞与非阻塞

Q2.如何响应
1. 在请求处理程序中通过return返回值,在HTTP服务器统一封装为response
在上一问中可知要尽量避免阻塞方式,那么在使用return时就会遇到问题

        var exec = require("child_process").exec; 
        //调用child_process模块的exec方法,功能从Node.js来执行一个shell命令
        function start() {
          console.log("Request handler 'start' was called.");
          var content = "empty";

          exec("ls -lah", function (error, stdout, stderr) {
            content = stdout;
          });
          /* exec使node.js执行ls -lah命令,
          为了实现非阻塞,使用回调函数把结果赋值给content变量*/

          return content;
        }

        function upload() {
          console.log("Request handler 'upload' was called.");
          return "Hello Upload";
        }

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

得到的结果为"empty"
原因分析:调用exec()后,就执行了return content,但此时因exec()的执行是异步的(nodejs异步处理)回调函数还没有执行到,于是return 回来的是empty

2.不限定响应的内容要在HTTP服务器封装,通过函数传值将response对象直接传递至需要的模块处理

Q3.POST
为处理过大的数据,使用非阻塞方式,将数据分成小数据块,然后通过触发特定的事件,将这些小数据块传递给回调函数(data小数据块到达,end数据接收完毕)
对request进行监听,监听data事件和end事件。

request.setEncoding("utf8");

request.addListener("data", function(postDataChunk) {
  postData += postDataChunk;
  console.log("Received POST data chunk '"+
  postDataChunk + "'.");
});

request.addListener("end", function() {
  route(handle, pathname, response, postData);
});

处理postData数据
querystring.parse(postData).text);

关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9
扫一扫关注公众号添加购物返利助手,领红包
Comments are closed.

推荐使用阿里云服务器

超多优惠券

服务器最低一折,一年不到100!

朕已阅去看看