NodeJS學習筆記--NodeJS+Express基礎概念梳理記錄

URL: https://www.jianshu.com/p/d72e33b986fb

寫在前面

本文章來源於一次分享中的筆記記錄。用於梳理基礎概念。

名詞解釋

Node.js

是一個基於Chrome JavaScript運行時建立的平臺, 用於方便地搭建響應速度快、易於擴展的網絡應用,Node.js 使用事件驅動, 非阻塞I/O 模型而得以輕量和高效,非常適合在分佈式設備上運行的數據密集型的實時應用。

NPM

一個NodeJS包管理和分發工具,它可以很快的找到特定服務要使用的包,進行下載、安裝以及管理已經安裝的包

Express

Express 是一個基於 Node.js 平臺的極簡、靈活的 web 應用開發框架


創建服務實例

var http = require('http');
var port = 3000;
var server = http.createServer(function(req,res) {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World\n');
})
server.listen(port,function() {
  console.log('Server running');
});

NodeJS特點

  • 事件驅動

事件驅動模型三大要素:
事件源:能夠接收外部事件的源體。
偵聽器:能夠接收事件源通知的對象。
事件處理程序:用於處理事件的對象。

  • 非阻塞I/O

阻塞調用是指調用結果返回之前,當前線程會被掛起。調用線程只有在得到結果之後纔會返回。
非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前線程。

  • 事件輪詢機制

一個事件輪詢擁有下面三個組件
事件隊列:這是一個FIFO模型的隊列,一方推入事件,另一方推出事件
隊列的讀取輪詢線程組件,也就是主角Event Loop,
單獨的線程池: 用來執行長任務(也就是threadpool,node底層,用C++寫的,不會阻塞)


在NodeJS中,只有一個主線程(也就是前面說的單線程)來不斷讀取輪詢(書中稱爲調用I/O觀察者)隊列中是否有事件。而對於讀取文件,HTTP請求等比較容易堵塞的事件,就在這個單線程中執行肯定會造成堵塞,所以Event Loop會把這類型的事件交給底層的線程池執行,並給予線程池一個回調函數,當線程池操作完成這堵塞任務後,便把結果和回調函數一起再放入輪詢隊列中。當單線程從隊列中不斷讀取事件,讀取到這些堵塞的操作結果後,會將這些操作結果作爲回調函數的輸入參數,然後激活運行回調函數。
Node.js的這個單線程不只是負責讀取隊列事件,還會執行運行回調函數
優點:適合大量I/O計算
缺點:不適合密集的cpu計算


NodeJS部分模塊介紹

  • http http是Node.JS從HTTP服務器獲取相應內容的主要模塊
http.createServer()//返回一個新的Web服務器對象
http.listen()//在指定的主機名和端口上建立連接
  • fs 處理文件系統的相關操作,例如讀寫文件,設置文件權限
  • path
path.extname('index.html')
// Returns: '.html'
path.dirname('/foo/bar/baz/asdf/quux')
// Returns: '/foo/bar/baz/asdf'
  • cluster模塊
    產生更多的NodeJS進程來處理系統的加載,使用相同的源代碼,監聽相同的端口
var cluster = require('cluster');
var numCpus = require('os').cpus().length;
cluster.isMaster//判斷是否爲主進程
cluster.isWorker//判斷是否爲子進程
cluster.worker.process.pid//獲取進程pid

NodeJS代理本地文件實例

var url  = require("url"),
     fs=require("fs"),
     http=require("http"),
     path = require("path");
http.createServer(function (req, res) {
    var pathname=__dirname+url.parse(req.url).pathname;//__dirname使用該全局變量的絕對路徑
    fs.exists(pathname,function(exists){
        if(exists){
            switch(path.extname(pathname)){
                case ".html":
                    res.writeHead(200, {"Content-Type": "text/html"});
                    break;
                case ".js":
                    res.writeHead(200, {"Content-Type": "text/javascript"});
                    break;
                default:
                    res.writeHead(200, {"Content-Type": "application/octet-stream"});
            }

            fs.readFile(pathname,function (err,data){
                res.end(data);
            });
        } else {
            res.writeHead(404, {"Content-Type": "text/html"});
            res.end("<h1>404 Not Found</h1>");
        }
    });
}).listen(8080, "127.0.0.1");

創建Web服務

安裝Express npm install express -g

  • 執行Express
  • 目錄結構
├─bin
├─public
│  ├─images
│  ├─javascripts
│  └─stylesheets
├─routes
├─views
├─app.js
└─package.json


Express API

Express 是一個自身功能極簡,完全是由路由和中間件構成一個的 web 開發框架:從本質上來說,一個 Express 應用就是在調用各種中間件。

中間件

中間件是一個函數,它可以訪問請求對象, 響應對象, 和 web 應用中處於請求-響應循環流程中的中間件

  • 執行任何代碼。
  • 修改請求和響應對象。
  • 終結請求-響應循環。
  • 調用堆棧中的下一個中間件。
路由

路由是指如何定義應用的端點(URIs)以及如何響應客戶端的請求。

  • HTTP請求方法
  • 請求路徑
  • 回調函數
  • 相應函數
var express = require('express');
var app = express();
app.get('/', function(req, res) {
  res.send('hello world');
});
  • Router()創建路由模塊化

引用文件

NodeJS官方文檔
Express4.x中文文檔
Node.JS項目實踐構建可擴展的Web應用書籍
了不起的NodeJS書籍
對NodeJS事件輪詢的理解
事件驅動



作者:進擊的程序茗
鏈接:https://www.jianshu.com/p/d72e33b986fb
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章