Nodejs初識

what it is?

  • Node.js的本質是一個Javascript的解析器
  • Node.js是Javascript 的運行環境
  • Node.js是一個服務器程序
  • Node.js自己使用的是V8引擎
  • Node不是web服務器

Why use it?

  • 爲了提供高性能的web服務
  • IO性能強大
  • 事件處理機制完善
  • 自然可以處理DOM
  • 社區很是活躍,生態圈日趨完善

The advantage

  • 處理大流量數據
  • 適合實時交互的應用
  • 完美支持對象數據庫
  • 異步處理大量併發連接

官網地址javascript

中文網地址html

安裝cnpm

  • npm install cnpm 安裝cnpm

第一個node程序

  • 建立 hello.js 並編輯 console.log("helloworld")
  • node hello.js //運行

#node最簡單的web服務java

  • 建立 server.jsnode

  • 引入 原生 apilinux

var http = require('htttp');
複製代碼
  • 建立一個服務
http.createServer(function (request,response) {
    //定義HTTP頭
    response.writeHead(200, {'Content-Type':'text/plan'});
    
    //發送相應的數據
    response.end('Hello world!\n');
}).listen(8000);

//服務運行以後輸出一行信息
console.log('server is running...');
複製代碼
  • 運行
node server.js
複製代碼
  • 打開瀏覽器 127.0.0.1:8000

Nodejs 環境及npm命令的深刻

REPL

全稱交互式解釋器 敲 node 命令進入 能夠在環境以後 直接進行代碼 的編寫 運算 優勢相似 瀏覽器的 console控制檯 通常來講咱們能夠在此環境下 進行一些 簡單的 代碼運算 驗證web

  • ctrl + c -退出當前終端
  • ctrl + c -按下兩次 退出 Node REPL
  • ctrl + d -退出Node REPL (linux環境下)
  • 向上/向下 鍵 -查看輸入的歷史命令
  • tab鍵 -列出當前命令
  • .help -列出使用命令
  • .break -退出多行表達式
  • .clear -退出多行表達式
  • .save filename -保存當前的Node REPL 會話到指定文件
  • .load filename -載入當前 Node REPL 會話的文件內容。

npm包管理器

  • npm install npm -g //升級npm
  • npm install express -g//安裝包express
  • npm uninstall packagename // 卸載包
  • npm search packagename // 查找包
  • npm help
  • npm help install // 具體查看 某個命令
  • cnpm 與 npm 的使用方法本質是相同的 只是服務器不一樣 一個國內 一個國外

什麼是回調

  • 函數調用方式分爲三類 :同步調用、回調和異步調用。
  • 回調時一種雙向調用模式
  • 能夠經過回調函數來實現回調

阻塞與非阻塞

  • 阻塞和非阻塞關注的是程序在等待調用的結果(消息,返回值)時的狀態。
  • 阻塞就是作不完不許回來
  • 非阻塞就是你先作,我如今看看有其餘事沒有,作完了告訴我一聲
//阻塞時代碼

var fs = require('fs');  

var data = fs.readFileSync('data.txt');   // 阻塞時用 同步讀取 readFileSync 非阻塞時用 readFile

console,log(data.toString());
複製代碼
//非阻塞代碼

var fs = require('fs');

fs.readFile('filename.txt',function(err,data){
    // todo something
    if(err){
        return console.error(err)
    }
    console.log(data.toString());
})
cosnole.log("程序執行完畢")
複製代碼

Node.js事件驅動機制

事件驅動模型

事件與事件綁定

  • nodejs 是一個單進程 單線程的程序,它並不能同時併發完成更多的事情,只能經過事件或者回調來實現併發效果
  • nodejs 的 api 全都是異步執行的,並且都是做爲獨立的線程處理的
  • nodejs 中的 幾乎全部的事件 都是依據觀察者模式 來實現的 觀察者模式 是設計模式中的一種
  • EventEmitters 對象 產生 Events 實例

事件處理代碼數據庫

//1. 引入 events對象,建立 eventEmitter對象
var events = require('events');
var eventEmitter = new events.EventEmmitter();

//2. 綁定事件處理程序
var connctHandler = function connected(){
    console.log('connected被調用了');
};
eventEmitter.on('connection', connctHandler()); //完成事件綁定
//3.觸發事件
eventEmitter.emit('connection');

console.log("程序執行完畢");
複製代碼

Nodejs 模塊化

模塊化的概念和意義

  • 爲了讓Node.js的文件能夠相互調用,Node.js提供了一個簡單的模塊系統
  • 模塊是Node.js應用程序的基本組成部分
  • 文件和模塊是一一對應的。一個Node.js文件就是一個模塊
  • 這個文件多是Javascript代碼、JSON或者編譯過的C/C++擴展
  • Node.js中存在4類模塊(原生模塊和3種文件模塊)

Node.js中的模塊

Node.js的模塊加載流程

模塊加載流程

文件的緩存區 有文件模塊緩存區 和 原生模塊緩存區express

  • require 方法接受一下幾種參數的傳遞: 1 http、fs、path等,原生模塊 2 ./mod或../mod,相對路徑的文件模塊 3 /pathtomodule/mo,絕對路徑的文件模塊
  • mod,非原生模塊的文件模塊

模塊化代碼案例

//main.js 主要調用模塊的文件
var Hello = require('./hello');

hello = new Hello();
hello.setName('Richard');
hello.sayHello();
//hello.js 模塊文件
function Hello(){
    var name ;
    this.setName = function(argName){
        name = argName
    }
    this.sayHello = function(){
        console.log('hellko' +  name);
    }
}

module.exports = Hello;
複製代碼

函數

  • 在javascript 中,一個函數能夠做爲另外一個函數的參數。
  • 咱們能夠先定義一個函數,而後傳遞,也能夠在傳遞參數的地方直接定義函數。
  • Nodejs 中的函數使用與Javascript 相似

代碼示例:npm

function say(word){
    console.log(word);
}
function execute(someFunction,value){
    someFunction(value);
}
execute(say,'hello')
複製代碼

匿名函數設計模式

function execute(someFunction,value){
    someFunction(value)
}
execute(function(word){
    console.log(word)
},'hello');
複製代碼

示例Ⅱ 一樣的功能,不一樣的實現方式

//匿名函數
var http = require('http');
http.createServer(function(request,response){
    response.writeHead(200,{"Content-Type":'text/plain'});
    response.write("Hello world");
    response.end();
}).listen(8000)


//先定義後傳遞

var http = require("http");
function onResquest(request,reponse){
    response.writeHead(200,{"Content-Type":'text/plain'});
    response.write("Hello World");
    response.end();
}
http.createServer(onResquest).listen(8888);
複製代碼

路由

咱們所須要的全部數據都會包含在request對象中,該對象做爲onRequest()回調函數的第一個參數傳遞。可是爲了解析這些數據,咱們須要額外的Node.JS模塊,他們分別是urlquerystring模塊

例如咱們 訪問 http://localhost:8888/start?foo=bar&hello=world

url.parse(string).query
                                    |
url.parse(string).pathname          |
                        |           |
                        |           |
                     ------ -------------------
http://localhost:8888/start?foo=bar&hello=world
                            ---       -----
                            |           |
                            |           |
querystring.parse(queryString)["foo"]   |
                                        |
                    querystring.parse(queryString)["hello"]
複製代碼
//server.js
var http = require("http");
var url = require("url");
 
function start(route) {
  function onRequest(request, response) {
    var pathname = url.parse(request.url).pathname;
    //console.log("Request for " + pathname + " received.");
    route(pathname,response);
   
  }
 
  http.createServer(onRequest).listen(8888);
  console.log("Server has started.");
}
exports.start = start;

//router.js
function route(pathname,response) {
  if(pathname == '/'){
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello World");
    response.end();
  }else if(pathname == "/index/home"){
    response.end('index');
  }else{
    response.end('index');
  }
}
exports.route = route;

//app.js
var server = require("./server");
var router = require("./router");
 
server.start(router.route);
複製代碼

獲取GET請求內容

var http = require('http');
var url = require('url');
var util = require('util');  //幫助類
 
http.createServer(function(req, res){
    res.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'});
    res.end(util.inspect(url.parse(req.url, true)));
}).listen(3000);
複製代碼

獲取POST請求內容

var http = require('http');
var querystring = require('querystring');
var util = require('util');
 
http.createServer(function(req, res){
    // 定義了一個post變量,用於暫存請求體的信息
    var post = '';     
 
    // 經過req的data事件監聽函數,每當接受到請求體的數據,就累加到post變量中
    req.on('data', function(chunk){    
        post += chunk;
    });
 
    // 在end事件觸發後,經過querystring.parse將post解析爲真正的POST請求格式,而後向客戶端返回。
    req.on('end', function(){    
        post = querystring.parse(post);
        res.end(util.inspect(post));
    });
}).listen(3000);
複製代碼

全局對象與全局變量

global 就是nodejs的全局對象 類比javascript的window

  • __filename __filename 表示當前正在執行的腳本的文件名。它將輸出文件所在位置的絕對路徑,且和命令行參數所指定的文件名不必定相同。 若是在模塊中,返回的值是模塊文件的路徑。

  • __dirname __dirname 表示當前執行腳本所在的目錄。

  • setTimeout(cb, ms) setTimeout(cb, ms) 全局函數在指定的毫秒(ms)數後執行指定函數(cb)。:setTimeout() 只執行一次指定函數。返回一個表明定時器的句柄值。

  • clearTimeout(t) clearTimeout( t ) 全局函數用於中止一個以前經過 setTimeout() 建立的定時器。 參數 t 是經過 setTimeout() 函數建立的定時器。

  • setInterval(cb, ms) setInterval(cb, ms) 全局函數在指定的毫秒(ms)數後執行指定函數(cb)。返回一個表明定時器的句柄值。可使用 clearInterval(t) 函數來清除定時器。setInterval() 方法會不停地調用函數,直到 clearInterval() 被調用或窗口被關閉。

  • process process 是一個全局變量,即 global 對象的屬性。它用於描述當前Node.js 進程狀態的對象,提供了一個與操做系統的簡單接口。一般在你寫本地命令行程序的時候,少不了要 和它打交道。下面將會介紹 process 對象的一些最經常使用的成員方法。

工具util

underscore.js

文件系統

讀取文件

var fs = require("fs");

// 異步讀取
fs.readFile('input.txt', function (err, data) {
   if (err) {
       return console.error(err);
   }
   console.log("異步讀取: " + data.toString());
});
// 同步讀取
var data = fs.readFileSync('input.txt');
console.log("同步讀取: " + data.toString());

console.log("程序執行完畢。");



複製代碼

打開文件

fs.open(path, flags[, mode], callback) 參數說明:

  • path - 文件的路徑。
  • flags - 文件打開的行爲。
  • mode - 設置文件模式(權限),文件建立默認權限爲 0666(可讀,可寫)。
  • callback - 回調函數,帶有兩個參數如:callback(err, fd)。

獲取文件信息

fs.stat(path, callback) 參數說明

  • path - 文件路徑。
  • callback - 回調函數,帶有兩個參數如:(err, stats), stats 是 fs.Stats 對象。

寫入文件

fs.writeFile(file, data[, options], callback)

  • file - 文件名或文件描述符。
  • data - 要寫入文件的數據,能夠是 String(字符串) 或 Buffer(緩衝) 對象。
  • options - 該參數是一個對象,包含 {encoding, mode, flag}。默認編碼爲 utf8, 模式爲 0666 , flag 爲 'w'
  • callback - 回調函數,回調函數只包含錯誤信息參數(err),在寫入失敗時返回。
var fs = require("fs");

console.log("準備寫入文件");
fs.writeFile('input.txt', '我是通 過fs.writeFile 寫入文件的內容',  function(err) {
   if (err) {
       return console.error(err);
   }
   console.log("數據寫入成功!");
   console.log("--------我是分割線-------------")
   console.log("讀取寫入的數據!");
   fs.readFile('input.txt', function (err, data) {
      if (err) {
         return console.error(err);
      }
      console.log("異步讀取文件數據: " + data.toString());
   });
});
複製代碼

等等 方法 參考 菜鳥教程

相關文章
相關標籤/搜索