一、Node.js 工具模塊
序號 | 模塊名 | 描述 |
---|---|---|
1 | OS 模塊 | 提供基本的系統操作函數。 |
2 | Path 模塊 | 提供了處理和轉換文件路徑的工具。 |
3 | Net 模塊 | 用於底層的網絡通信。提供了服務端和客戶端的的操作。 |
4 | DNS 模塊 | 用於解析域名。 |
5 | Domain 模塊 | 簡化異步代碼的異常處理,可以捕捉處理try catch無法捕捉的。 |
更多詳情見:菜鳥教程:https://www.runoob.com/nodejs/nodejs-utitlity-module.html
二、Node.js Web 模塊
1. Web 應用架構
-
Client - 客戶端,一般指瀏覽器,瀏覽器可以通過 HTTP 協議向服務器請求數據。
-
Server - 服務端,一般指 Web 服務器,可以接收客戶端請求,並向客戶端發送響應數據。
-
Business - 業務層, 通過 Web 服務器處理應用程序,如與數據庫交互,邏輯運算,調用外部程序等。
-
Data - 數據層,一般由數據庫組成。
2. 使用 Node 創建 Web 服務器 和 Web 客戶端
Node.js 提供了 http 模塊,http 模塊主要用於搭建 HTTP 服務端和客戶端,使用 HTTP 服務器或客戶端功能必須調用 http 模塊,代碼如下:
var http = require('http');
具體示例見:菜鳥教程:https://www.runoob.com/nodejs/nodejs-web-module.html
三、Node.js Express 框架
1. Express 框架核心特性:
-
可以設置中間件來響應 HTTP 請求。
-
定義了路由表用於執行不同的 HTTP 請求動作。
-
可以通過向模板傳遞參數來動態渲染 HTML 頁面。
2. 安裝 Express:
$ cnpm install express --save
以下幾個重要的模塊是需要與 express 框架一起安裝的:
-
body-parser - node.js 中間件,用於處理 JSON, Raw, Text 和 URL 編碼的數據。
-
cookie-parser - 這就是一個解析Cookie的工具。通過req.cookies可以取到傳過來的cookie,並把它們轉成對象。
-
multer - node.js 中間件,用於處理 enctype="multipart/form-data"(設置表單的MIME編碼)的表單數據。
3. 第一個 Express 框架實例
在瀏覽器中訪問 http://127.0.0.1:8081時,頁面會呈現 Hello World 。
//express_demo.js 文件
var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('Hello World');
})
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
console.log("應用實例,訪問地址爲 http://%s:%s", host, port)
})
4. 其他
-
請求和響應
-
路由
-
靜態文件
-
GET 方法
-
POST 方法
-
文件上傳
-
Cookie 管理
更多詳情見:菜鳥教程:https://www.runoob.com/nodejs/nodejs-express-framework.html
四、Node.js RESTful API
REST即表述性狀態傳遞(英文:Representational State Transfer,簡稱REST)是一種軟件架構風格。
表述性狀態轉移是一組架構約束條件和原則。滿足這些約束條件和原則的應用程序或設計就是RESTful。需要注意的是,REST是設計風格而不是標準。REST通常基於使用HTTP,URI,和XML(標準通用標記語言下的一個子集)以及HTML(標準通用標記語言下的一個應用)這些現有的廣泛流行的協議和標準。REST 通常使用 JSON 數據格式。
HTTP 方法:以下爲 REST 基本架構的四個方法:
-
GET - 用於獲取數據。
-
PUT - 用於更新或添加數據。
-
DELETE - 用於刪除數據。
-
POST - 用於添加數據。
創建 RESTful:
首先,創建一個 json 數據資源文件 users.json,內容如下:
{
"user1" : {
"name" : "mahesh",
"password" : "password1",
"profession" : "teacher",
"id": 1
},
"user2" : {
"name" : "suresh",
"password" : "password2",
"profession" : "librarian",
"id": 2
},
"user3" : {
"name" : "ramesh",
"password" : "password3",
"profession" : "clerk",
"id": 3
}
}
基於以上數據,我們創建以下 RESTful API:
序號 | URI | HTTP 方法 | 發送內容 | 結果 |
---|---|---|---|---|
1 | listUsers | GET | 空 | 顯示所有用戶列表 |
2 | addUser | POST | JSON 字符串 | 添加新用戶 |
3 | deleteUser | DELETE | JSON 字符串 | 刪除用戶 |
4 | :id | GET | 空 | 顯示用戶詳細信息 |
獲取用戶列表:
var express = require('express');
var app = express();
var fs = require("fs");
app.get('/listUsers', function (req, res) {
fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
console.log( data );
res.end( data );
});
})
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
console.log("應用實例,訪問地址爲 http://%s:%s", host, port)
})
更多詳情見:菜鳥教程:https://www.runoob.com/nodejs/nodejs-restful-api.html
五、Node.js 多進程
我們都知道 Node.js 是以單線程的模式運行的,但它使用的是事件驅動來處理併發,這樣有助於我們在多核 cpu 的系統上創建多個子進程,從而提高性能。
每個子進程總是帶有三個流對象:child.stdin,child.stdout 和 child.stderr。他們可能會共享父進程的 stdio 流,或者也可以是獨立的被導流的流對象。
Node 提供了 child_process 模塊來創建子進程,方法有:
-
exec - child_process.exec 使用子進程執行命令,緩存子進程的輸出,並將子進程的輸出以回調函數參數的形式返回。
-
spawn - child_process.spawn 使用指定的命令行參數創建新進程。
-
fork - child_process.fork 是 spawn()的特殊形式,用於在子進程中運行的模塊,如 fork('./son.js') 相當於 spawn('node', ['./son.js']) 。與spawn方法不同的是,fork會在父進程與子進程之間,建立一個通信管道,用於進程之間的通信。
更多詳情見:菜鳥教程:https://www.runoob.com/nodejs/nodejs-process.html
六、Node.js JXcore 打包
JXcore 是一個支持多線程的 Node.js 發行版本,基本不需要對你現有的代碼做任何改動就可以直接安全地以多線程運行。
包代碼:
我們使用 jx 命令打包 Node.js 項目的幾個文件,並指定 index.js 爲 Node.js 項目的主文件:
jx package index.js index
以上命令執行成功,會生成以下兩個文件:
-
index.jxp 這是一箇中間件文件,包含了需要編譯的完整項目信息。
-
index.jx 這是一個完整包信息的二進制文件,可運行在客戶端上。
載入 JX 文件:
Node.js 的項目運行:
node index.js command_line_arguments
使用 JXcore 編譯後,我們可以使用以下命令來執行生成的 jx 二進制文件:
jx index.jx command_line_arguments
更多詳情見:菜鳥教程:https://www.runoob.com/nodejs/nodejs-jxcore-packaging.html
七、Node.js 連接 MySQL
安裝驅動:
cnpm install mysql
連接數據庫:在以下實例中根據你的實際配置修改數據庫用戶名、密碼及數據庫名:
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '123456',
database : 'test'
});
connection.connect();
connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results[0].solution);
});
數據庫操作( CURD ):查詢數據、插入數據、更新數據、刪除數據,以查詢數據爲例,如下所示:
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '123456',
port : '3306',
database : 'test'
});
connection.connect();
var sql = 'SELECT * FROM websites';
//查
connection.query(sql,function (err, result) {
if(err){
console.log('[SELECT ERROR] - ',err.message);
return;
}
console.log('--------------------------SELECT----------------------------');
console.log(result);
console.log('------------------------------------------------------------\n\n');
});
connection.end();
更多詳情見:菜鳥教程:https://www.runoob.com/nodejs/nodejs-mysql.html
八、Node.js 連接 MongoDB
MongoDB是一種文檔導向數據庫管理系統,由C++撰寫而成。
安裝驅動:
cnpm install mongodb
創建數據庫:
要在 MongoDB 中創建一個數據庫,首先我們需要創建一個 MongoClient 對象,然後配置好指定的 URL 和 端口號。
如果數據庫不存在,MongoDB 將創建數據庫並建立連接。
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/runoob";
MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
if (err) throw err;
console.log("數據庫已創建!");
db.close();
});
創建集合:
我們可以使用 createCollection() 方法來創建集合。
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/runoob';
MongoClient.connect(url, { useNewUrlParser: true }, function (err, db) {
if (err) throw err;
console.log('數據庫已創建');
var dbase = db.db("runoob");
dbase.createCollection('site', function (err, res) {
if (err) throw err;
console.log("創建集合!");
db.close();
});
});
數據庫操作( CURD ):
與 MySQL 不同的是 MongoDB 會自動創建數據庫和集合,所以使用前我們不需要手動去創建。
查詢數據 find()、插入數據 insertOne() / insertMany()、更新數據 updateOne() / updateMany()、刪除數據 deleteOne() / deleteMany() ,以插入數據爲例,如下所示:
// 插入單條數據可以使用 insertOne(); 如果要插入多條數據可以使用 insertMany()
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("runoob");
var myobj = { name: "菜鳥教程", url: "www.runoob" };
dbo.collection("site").insertOne(myobj, function(err, res) {
if (err) throw err;
console.log("文檔插入成功");
db.close();
});
});
排序:排序 使用 sort() 方法,該方法接受一個參數,規定是升序(1)還是降序(-1)。例如:
-
{ type: 1 } // 按 type 字段升序 { type: -1 } // 按 type 字段降序
查詢分頁:
- 如果要設置指定的返回條數可以使用 limit() 方法,該方法只接受一個參數,指定了返回的條數。
- 如果要指定跳過的條數,可以使用 skip() 方法。
連接操作:mongoDB 不是一個關係型數據庫,但我們可以使用 $lookup 來實現左連接。
例如我們有兩個集合數據分別爲:集合1:orders 和 集合2:products。
// $lookup 實現左連接
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://127.0.0.1:27017/";
MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("runoob");
dbo.collection('orders').aggregate([
{ $lookup:
{
from: 'products', // 右集合
localField: 'product_id', // 左集合 join 字段
foreignField: '_id', // 右集合 join 字段
as: 'orderdetails' // 新生成字段(類型array)
}
}
]).toArray(function(err, res) {
if (err) throw err;
console.log(JSON.stringify(res));
db.close();
});
});
刪除集合:我們可以使用 drop() 方法來刪除集合。
更多詳情見:菜鳥教程:https://www.runoob.com/nodejs/nodejs-mongodb.html
END