NodeJS入門筆記

跟着Node入門學習nodeJS,小筆記html

Node.JS???

Node.js 使用Google的V8虛擬機,使javaScript代碼能在脫離瀏覽器環境的狀況下運行,至關於說Node.js提供了一個能夠解釋並執行JS代碼的環境。
Node.js 的核心是模塊化,Node.js經過代碼模塊化簡化不少重複的操做,至關於提供了一個功能強大的庫java

Web過程

圖片描述

  1. index.js
    做爲入口,引導和啓動其餘模塊,node

    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模塊shell

    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.異步與同步,阻塞與非阻塞異步

  • 異步與同步
    同步:發起處理後要在原地等待結果,取到結果後再進行下一步操做分佈式

    調用者主動等待這個調用的結果模塊化

    異步:發起處理後能夠去作其餘事,結果出來後再去取結果函數

    被調用者經過狀態、通知來通知調用者,或經過回調函數處理這個調用

    知乎上看到的栗子

    你打電話問書店老闆有沒有《分佈式系統》這本書,若是是同步通訊機制,書店老闆會說,你稍等,」我查一下",而後開始查啊查,等查好了(多是5秒,也多是一天)告訴你結果(返回結果)。
    而異步通訊機制,書店老闆直接告訴你我查一下啊,查好了打電話給你,而後直接掛電話了(不返回結果)。而後查好了,他會主動打電話給你。在這裏老闆經過「回電」這種方式來回調。

  • 阻塞和非阻塞
    阻塞指在結果返回前,線程被掛起
    非阻塞指線程不會被一個調用獨佔

    仍是知乎上的栗子

    你打電話問書店老闆有沒有《分佈式系統》這本書,你若是是阻塞式調用,你會一直把本身「掛起」,直到獲得這本書有沒有的結果,若是是非阻塞式調用,你無論老闆有沒有告訴你,你本身先一邊去玩了, 固然你也要偶爾過幾分鐘check一下老闆有沒有返回結果。
    在這裏阻塞與非阻塞與是否同步異步無關。跟老闆經過什麼方式回答你結果無關。

    NodeJS 並行機制
    Node.js是單線程的。它經過事件輪詢(event loop)來實現並行操做,所以在使用Node.js時儘可能使用非阻塞操做,一般的實現方法爲使用回調函數

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);

相關文章
相關標籤/搜索