這有一篇Nodejs+Express的初級指南……

寫在前面:

這是小生跟着視頻學習的總結,文末貼的有地址,很容易上手,本身都跟着敲了一遍,以爲不錯,
值得總結安利一下,歡迎糾錯……
複製代碼

1、 Nodejs建立第一個應用

  1. 引入 http 模塊php

    var http = require("http");
    複製代碼
  2. 建立服務器

    接下來咱們使用 http.createServer() 方法建立服務器,並使用 listen 方法綁定 8888 端口。 函數經過 request, response 參數來接收和響應數據。html

var http = require('http'); 
http.createServer(function (request, response) {
// 發送 HTTP 頭部
// HTTP 狀態值: 200 : OK
//設置 HTTP 頭部,狀態碼是 200,文件類型是 html,字符集是 utf8 response.writeHead(200,{"Content-Type":"text/html;charset=UTF-8"});
// 發送響應數據 "Hello World"
res.end("哈哈哈哈,我買了一個 iPhone" + (1+2+3) + "s"); }).listen(8888 );
// 終端打印以下信息
console.log('Server running at http://127.0.0.1:8888/');
複製代碼
  1. 運行程序java

    node server.js
    複製代碼

2、HTTP模塊, URL模塊

2.1 HTTP 模塊的使用node

//引用模塊
var http = require("http");
//建立一個服務器,回調函數表示接收到請求以後作的事情
var server = http.createServer(function(req,res){ //req 參數表示請求,res 表示響應
// 設置一個響應頭
res.writeHead(200,{"Content-Type":"text/htm l;c harset=UTF8"});

console.log("服務器接收到了請求" + req.url);

res.end(); // End 方法使 Web 服務器中止處理腳本並返回當前結果
});
//監聽端口
server.listen(3000,"127.0.0.1");
複製代碼

2.二、URL 模塊的使用mysql

url.parse() 解析 URL
url.format(urlObject) //是上面 url.parse() 操做的逆向操做
url.resolve(from, to) 添加或者替換地址
複製代碼
  1. url.parse()

  1. url.format()

3. url.resolve()

3、 Nodejs 自啓動工具 supervisorgit

supervisor 會不停的 watch 你應用下面的全部文件,發現有文件被修改,就從新載入程序文件這樣就實現了部署,修改了程序文件後立刻就能看到變動後的結果。麻麻不再用擔憂個人重啓 nodejs 了!github

  1. 首先安裝 supervisorsql

    npm install -g supervisor
    複製代碼
  2. 使用 supervisor 代替 node 命令啓動應用mongodb

3、 Nodejs中的 FS 模塊

  1. fs.stat 檢測是文件仍是目錄
fs.stat('hello.js', (error, stats) =>{ 
    if (error){
        console .log(error) 
    } else {
        console .log(stats)
        console .log(`文件: ${stats.isFile()}` )
        console .log(`目錄: ${stats.isDirectory()}` ) 
    }
})
複製代碼
  1. fs.mkdir 建立目錄
const fs = require('fs')
fs.mkdir('logs', (error) => { 
    if (error){
        console .log(error)
    } else {
        console .log('成功創 建目錄:logs' )
    }
})
複製代碼
  1. fs.writeFile 建立寫入文件
fs.writeFile('logs/hello.log', '您好 ~ \n', (error) => {
    if(error) {
        console .log(error)
    } else {
        console .log('成功寫入文件' )
    }
})
複製代碼
  1. fs.appendFile 追加文件
fs.appendFile('logs/hello.log', 'hello ~ \n', (error) => { 
     if(error) {
        console .log(error) } 
    else {
        console .log('成功寫入文件' ) 
    }
})
複製代碼
  1. fs.readFile 讀取文件
const fs = require('fs')
fs.readFile('logs/hello.log', 'utf8', (error, data) =>{ 
    if (error) {
        console .log(error) 
    } else {
        console .log(data) 
    }
})
複製代碼
  1. fs.readdir 讀取目錄
const fs = require('fs')
fs.readdir('logs', (error, files) => { 
    if (error) {
        console .log(error)
    } else {
        console .log(files)
    } 
})
複製代碼
  1. fs.rename 重命名
const fs = require('fs')
fs.rename('js/hello.log', 'js/greeting.log', (error) =>{
    if (error) {
        console .log(error)
    } else {
        console .log(' 重命名成功' )
    } 
})
複製代碼
  1. fs.rmdir 刪除目錄
fs.rmdir('logs', (error) =>{
    if (error) {
        console .log(error)
    } else { 
        console.log('成功的刪除了目錄:logs')
    } 
})
複製代碼
  1. fs.unlink 刪除文件
fs.unlink(`logs/${file}`, (error) => { 
   if (error) {
       console .log(error)
   } else {
       console.log(`成功的刪除了文件: ${file}`) 
   }
})
複製代碼
  1. fs.createReadStream 從文件流中讀取數據
const fs = require('fs')
var fileReadStream = fs.createReadStream('data.json')
let count=0; 
var str='';
fileReadStream.on('data', (chunk) => {
   console.log(`${ ++count } 接收到:${chunk.length}`);
   str += chunk; 
})
fileReadStream.on('end', () => { 
   console.log('--- 結束 ---'); 
   console.log(count );
   console.log(str ); 
})
fileReadStream.on('error', (error) => { 
   console .log(error)
})
複製代碼
  1. fs.createWriteStream 寫入文件
var fs = require("fs");
var data = '我是從數據庫獲取的數據,我要保存起來';
// 建立一個能夠寫入的流,寫入到文件 output.txt 中
var writerStream = fs.createWriteStream('output.txt'); 
// 使用 utf8 編碼寫入數據
writerStream .write(data ,'UTF8' ); // 標記文件末尾
writerStream .end();
// 處理流事件 --> finish 事件
writerStream.on('finish', function() { 
/*finish - 全部數據已被寫入到底層系統時觸發。*/ 
   console .log("寫入完成。" );
});
writerStream.on('error', function(err){
   console.log(err.stack); 
});
console .log("程序執行完畢" );
複製代碼
  1. 管道流 管道提供了一個輸出流到輸入流的機制。 一般咱們用於從一個流中獲取數據並將數據傳遞到另一個流中。

如上面的圖片所示,咱們把文件比做裝水的桶,而水就是文件裏的內容,咱們用一根管子(pipe )鏈接兩個桶使得水從一個桶流入另外一個桶,這樣就慢慢的實現了大文件的複製過程。如下實例咱們經過讀取一個文件內容並將內容寫入到另一個文件中。

var fs = require("fs");
// 建立一個可讀流
var readerStream = fs.createReadStream('input.txt'); // 建立一個可寫流
var writerStream = fs.createWriteStream('output.txt');
// 管道讀寫操做
// 讀取 input.txt 文件內容,並將內容寫入到 output.txt 文件中 
readerStream.pipe(writerStream );
console.log("程 序執行完畢" );
複製代碼

4、 Nodejs 建立一個 WEB 服務器。

  1. server.js
// 引入http模塊
var http = require('http');
// 引入fs模塊
var fs = require('fs');
// 引入path模塊
var path = require('path');
// 引入url模塊
var url = require('url');
// 引入自定義的解析模塊;
var mime = require('./model/getMimeFile.js');
http.createServer(function (req,res) {
    <!-- 處理請求地址,獲取請求的pathname  -->
    var pathName = url.parse(req.url).pathname;
    <!-- 設置響應頭 根據文件後綴設置不一樣的Content-Type,讓瀏覽器解析該文件 -->
    res.writeHead(200, {"Content-Type": " " + mime.getMime(fs, path.extname(pathName))+ "; charset=utf-8"});
    
    if(pathName == '/') pathName = '/index/html';
    if(pathName !== '/favicon.ico') {
        // 文件操做去讀取static下面的index.html
        fs.readFile('static/'+pathName,function (err,data) {
            if(err){
                fs.readFile('static/404.html',function (err,data404) {
                    res.write(data404);
                    res.end();
                })
            } else {
                // console.log(data);
                res.write(data);
                res.end();
            }
        })
    }
    
}).listen('8002');
複製代碼
  1. getMimeFile.js
exports.getMime = function (fs,extname) {
    var data = fs.readFileSync('./mime.json');
    var Mimes = JSON.parse(data.toString())
    return Mimes[extname] || 'text/html';
}
複製代碼

5、 Nodejs 的非阻塞 I/O、異步、事件驅動

  1. Nodejs的單線程 非阻塞I/O事件驅動
在 Java、PHP 或者.net 等服務器端語言中,會爲每個客戶端鏈接建立一個新的線程。
而每一個線程須要耗費大約 2MB 內存。也就是說,理論上,一個8GB 內存的服務器能夠同時 鏈接的最大用戶數爲 4000 個左右。
要讓 Web 應用程序支持更多的用戶,就須要增長服務器 的數量,而 Web 應用程序的硬件成本固然就上升了。
Node.js 不爲每一個客戶鏈接建立一個新的線程,而僅僅使用一個線程。
當有用戶鏈接了,就觸發一個內部事件,經過非阻塞 I/O、事件驅動機制,讓 Node.js 程序宏觀上也是並行的。 
使用 Node.js,一個 8GB 內存的服務器,能夠同時處理超過 4 萬用戶的鏈接。
複製代碼
  1. Nodejs 回調處理異步
//正確的處理異步:
function getData(callback){ //模擬請求數據
    var result=''; 
    setTimeout(function (){
        result='這是請求到的 數據'; 
        callback(result);
    },200); 
}
getData(function(data){
    console.log(data);
})
複製代碼
  1. Nodejs events 模塊處理異步
// 引入 events 模塊
var events = require('events');
var EventEmitter = new events.EventEmitter() ; /*實例化事件對象*/
EventEmitter.on('toparent',function(){ 
    console.log('接收到了廣播事件');
})
setTimeout(function (){
    console.log('廣播');
    EventEmitter.emit('toparent'); /*發送廣播*/ 
},1000)
複製代碼

6、 Nodejs的 ejs 模板引擎

  1. 路由
    官方解釋:
    路由(Routing)是由一個 URI(或者叫路徑)和一個特定的 HTTP 方法(GET、POST 等)組成 的,涉及到應用如何響應客戶端對某個網站節點的訪問。

  1. 初識 EJS 模塊引擎

文檔: www.npmjs.com/package/ejs
安裝 :數據庫

npm install ejs –save     /     cnpm install ejs --save
複製代碼

Nodejs中使用:

ejs.renderFile(filename, data, options, function(err, str){ 
    str => Rendered HTML string
});
複製代碼

EJS 經常使用標籤

  • <%%>流程控制標籤
  • <%=%>輸出標籤(原文輸出HTML標籤)
  • <%-%>輸出標籤(HTML會被瀏覽器解析)
<a href="<%= url %>"><img src="<%= imageURL %>" alt=""></a><ul>
   <ul>
       <% for(var i = 0 ; i < news.length ; i++){ %> 
           <li> <%= news[i] %> </li> 
       <% } %>
   </ul>
   
複製代碼
  1. Get、Post

超文本傳輸協議(HTTP)的設計目的是保證客戶端機器與服務器之間的通訊。
在客戶端和服務器之間進行請求-響應時,兩種最常被用到的方法是:GET 和 POST。
GET - 從指定的資源請求數據。(通常用於獲取數據)
POST - 向指定的資源提交要被處理的數據。(通常用於提交數據)

獲取 GET 傳值:

var urlinfo = url.parse(req.url,true); 
urlinfo.query();
複製代碼

獲取 POST 傳值:

var postData = ''; // 數據塊接收中
req.on('data', function (postDataChunk) { 
    postData += postDataChunk;
});
// 數據接收完畢,執行回調函數
req.on('end', function () { 
    try {
        postData = JSON.parse(postData); 
    } 
    catch (e) { }
    req.query = postData;
    console.log(querystring .parse(postData));
});
複製代碼

7、 MongoDb 數據庫介紹、安裝、使用

  1. 數據庫和文件的主要區別
一、 數據庫有數據庫表、行和列的概念,讓咱們存儲操做數據更方便
二、 數據庫提供了很是方便的接口,可讓 nodejs、php java .net 很方便的實現增長修改刪除功能。
複製代碼
  1. NoSql 介紹
NoSQL(NoSQL = Not Only SQL ),意即「不只僅是 SQL」,
它指的是非關係型的數據庫,是以key-value形式存儲,和傳統的關係型數據庫不同,
不必定遵循傳統數據庫的一些基本要求.
複製代碼
  1. 何時建議使用 NoSql
一、對數據庫高併發讀寫的需求 
二、對海量數據的高效率存儲和訪問的需求
三、對數據庫的高可擴展性和高可用性的需求
複製代碼
  1. NoSql 和傳統數據庫簡單對比
非結構型數據庫。沒有行、列的概念。用 JSON 來存儲數據。
集合就至關於「表 」,文檔就至關於「行」。
複製代碼

  1. mongodb的使用方法
    i. mongodb的安裝方法
    ii. 開啓 mongodb服務:要管理數據庫,必須先開啓服務,而後進行數據庫的相關操做
    iii. mongodb的經常使用指令

    查詢 (find)
    增長 (insert)
    修改 (update)
    刪除(remove)

```
查看全部數據庫列表    show dbs
使用數據庫、建立 數據庫    use student  (student表明 data_base_name);

插入(增長)一條數據    db.student.insert({「name」:」xiaoming」});
db.表名.insert({"name":"zhangsan"}); student 集合名稱(表)

顯示當前的數據集合(mysql 中叫表)    show collections
刪除數據庫,刪除當前所在的數據庫    db.dropDatabase();
刪除集合,刪除指定的集合 刪除表     db.user.drop();

一、查詢全部記 錄
db.userInfo.find();
至關於:select* from userInfo;

二、查詢 age > 22 的記錄 db.userInfo.find({age: {$gt: 22}});
至關於:select * from userInfo where age >22;

三、查詢 age < 22 的記錄
db.userInfo.find({age: {$lt: 22}}); 
至關於:select * from userInfo where age <22; 

四、查詢 age >= 25 的記錄
db.userInfo.find({age: {$gte: 25}}); 
至關於:select * from userInfo where age >= 25;

五、查詢 age <= 25 的記錄 
db.userInfo.find({age: {$lte: 25}});

6. 按照年齡排序 1 升序 -1 降序 
升序: db.userInfo.find().sort({age: 1}); 
降序: db.userInfo.find().sort({age: -1});

7. 查詢前 5 條數據 db.userInfo.find().limit(5 ); 
   至關於:selecttop 5 * from userInfo;

修改數據  
查找名字叫作小明的,把年齡更改成 16 歲:
db.student.update({"name":"小明"},{$set:{"ag e":16}});

刪除數據
db.collectionsNames.remove( { "borough": "Manhattan" } )
db.users.remove({age: 132});

```
複製代碼

8、 express的介紹

1. express的安裝使用

npm install express –save 
複製代碼
demo:
    var express=require('express');  /*引入 express*/
    var app=newexpress(); /*實例化express 賦值給app*/
    //配置路由 匹配 URl 地址實現不一樣的功能
    app.get('/',function(req,res){ 
        res.send('首頁');
    }) 
    app.get('/search',function(req,res){
        res.send('搜索'); //?keyword=華爲手機&enc=utf-8&suggest=1.his.0.0&wq
    })
    app.get('/login',function(req,res){ 
        res.send('登陸');
    }) 
    app.get('/register',function(req,res){
        res.send('註冊');
    }) 
    app.listen(3000,"127.0.0.1");
複製代碼

2. Express 框架中的路由

當用 get 請求訪問一個網址的時候,作什麼事情:
app.get("網址",function(req,res){

});

當用 post 訪問一個網址的時候,作什麼事情:
app.post("網址",function(req,res){

});
// user 節點接受 PUT 請求
app.put('/user', function (req, res) {
    res.send('Got a PUT request at /user'); 
});

// user 節點接受 DELETE 請求 
app.delete('/user', function (req, res) {
   res.send('Got a DELETE request at /user'); 
});

動態路由配置:
"/user/:id "
app.get( ,function(req,res){ 
    var id = req.params["id"];
    res.send(id); 
});
路由的正則匹配:(瞭解)
 app.get('/ab*cd', function(req, res) { 
    res.send('ab*cd');
});

路由裏面獲取 Get 傳值
/news?id=2&sex=nan

app.get('/news, function(req, res) { console.log(req.query); }); 複製代碼

三、Express 框架中 ejs 的安裝使用:

i. npm install ejs --save-dev   // 安裝

ii. Express 中 ejs 的使用:

var express = require("express");
var app = express();
app.set("view engine","ejs");
app.get("/",function(req,res){ });
res.render("news",{
    "news" : ["我是小新聞啊","我也是啊","哈哈哈哈"]
}); app.listen(3000);

iii. 指定模板位置 ,默認模板位置在 views
 
 app.set('views', __dirname + '/views');
 
iv. Ejs 後綴修改成 Html
這是一個小技巧,看着.ejs 的後綴總以爲不爽,使用以下方法,能夠將模板文件的後綴換成咱們習慣的.html。

1.在 app.js 的頭上定義 ejs:,代碼以下:
var ejs = require('ejs');
2.註冊 html 模板引擎代碼以下: 
app.engine('html',ejs.__express);
3.將模板引擎換成 html代碼以下:
app.set('view engine', 'html');
4.修改模 板文件的後綴爲 .html。
複製代碼

4. 利用 Express.static 託管靜態文件

一、若是你的靜態資源存放在多個目錄下面,你能夠屢次調用 express.static 中間件:

app.use(express.static('public'));
複製代碼

如今,public目錄下面的文件就能夠訪問了

二、若是你但願全部經過 express.static 訪問的文件都存放在一個「虛擬(virtual)」目 錄(即目錄根本不存在)下面,能夠經過爲靜態資源目錄指定一個掛載路徑的方式來實現

app.use('/static', express.static('public'));
複製代碼

如今,你就能夠經過帶有 「/static」 前綴的地址來訪問 public 目錄下 面的文件了。

五、 Express 中間件 (powerful function)

  1. 應用級中間件

2. 路由中間件

3. 錯誤處理中間件

  1. 內置中間件

5. 第三方中間件

body-parser    獲取post提交的數據  
複製代碼

六、 獲取 Get Post 請求的參數

● GET 請求的參數在 URL 中,在原生 Node 中,須要使用 url 模塊來識別參數字符串。在Express 中,不須要使用 url 模塊了。能夠直接使用 req.query 對象。

● POST 請求在 express 中不能直接得到,可使用 body-parser模塊。使用後,將能夠用req.body獲得參數。可是若是表單中含有文件上傳,那麼仍是須要使用 formidable 模塊。

var express = require('express')
var bodyParser = require('body-parser')
var app = express()
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
// parse application/json
app.use(bodyParser.json())
app.use(function (req, res) { 
    res.setHeader('Content-Type', 'text/plain') 
    res.write('you posted:\n')
    res.end(JSON.stringify(req.body, null, 2))
})
複製代碼

知識點大概總結這麼多,也算是給前段時間的學習作了一個總結,免得學點,忘點[捂臉🤦‍♀️]

GitHub地址: node+express; 歡迎交流學習……

聲明:知識點總結是跟着 大地老師的node視頻

一點點學習的,整個課程仍是很詳細的,有興趣的能夠下載下來自學……

相關文章
相關標籤/搜索