什麼是:不是JS,是一種軟件開發平臺,它的競爭對象JSP/PHP/ASP.NET,歷史第一次有一種語言可以通吃前後端.
Node運行的兩種方式:
1.交互模塊---簡單瞭解(測試新功能)
REPL:輸入一行代碼執行一行
注意:交互模自帶輸出功能,不必一定要 console.log()
node 回車 進入交互模式
.exit 退出
2.腳本模塊—正式項目中使用
把要執行所有語句編寫一個文本文件中(後綴任意,沒有),一次性提交node解析器執行.
node 完整路徑/x.js 回車
提交:只要安裝成node.js,重啓webstorm,ws可以自動發現node.exe解析,新的項目和文件編寫一定UTF-8
建議:所有目錄名稱,不要有中文,不要有空格
數據類型:(nodejs vs js)
nodejs | js |
(1) 基本/原生/值類型 string/number/boolean/null/undefined (2)引用類型 ES對象類型:Error/Data/Math/Array/RegExp/Object/.... 用戶自定義對象類型:{} Node.JS 第三方對象:十萬多 https://www.npmjs.com/ |
(1)基本/原生/值類型 string/number/boolean/null/undefined (2)引用類型 ES對象類:Error/Data/Math/Array/RegExp/Object/.... BOM:window;docuemnt,location,event,screen,.... DOM:Element,Attribute,..... 用戶自定義對象類型:{} |
模塊概念:
一個項目中多個”模塊”,訂單模塊,用戶模塊,支付模塊....
node.js按照功能,可以把函數,對象分別保存不同文件或目錄下,這些目錄和文件在node.js稱爲一個“模塊”
##注意:Node.JS每個一個模塊都是一個獨立構造函數,
Node.JS解析器自動爲每一個.js文件添加如下代碼.
(function(exports,require,module,__filename,__dirname){
exports:{} 用於聲明向外部導出自己成員
require:fn 用於導入其它的模塊,並且創建指定模塊對象
module: 當前模塊對象
__filename
__dirname
var i = 10;
var j = 11;
console.log(i+j);
});
每個模塊都可以使用自己require();引入另一個模塊—底層本質是創建指定模塊一個對象實例.
自定義模塊的兩種形式:
(1)文件模塊
創建一個JS文件,如m3.js,導出其公開數據,
其它模塊可以require("./m3");引入
(2)目錄模塊
方式一:創建一個目錄,假設m4,其中創建index.js文件,導
出需要公開數據。其它模塊引入
var m = require(“./m4”);
方式二:創建一個目錄,假設m5,其中創建5.js文件,導出需要
公開數據數據,創建package.json文件 main指定啓動
文件 5.js 其它模塊引入
var m = require(“./m5”);
方式三:創建一個目錄,必須名爲 node_modules
,其中再創建目錄模塊,假設 m6 其中創建 package.json
文件,其中聲明 main屬性指定默認執行啓動js,如6.js,
其中導出需要公共數據,其它模塊引入
require(“m6”);
原生模塊的使用(解析引擎自帶)
1.Buffer(緩衝區)
Buffer:緩衝區,本質上是一塊內存區域,用於暫存以後要用到數據
(數字,字符串,二進制圖片/音頻/視頻),該區域稱爲“緩存”
#分配置一個指定大小緩衝區 1024字節
建議:緩衝區大小不超過 512KB 512*1024
var buff1 = Buffer.alloc(1024);
#使用一個數組創建緩衝區
var buff2 = Buffer.from([1,2,3]);
#使用一個字符串創建緩衝區
var buff4 = Buffer.from(“abc”);
#將一個緩衝區內容轉換字符串{如果緩衝區數據是字符串}
var str = buff4.toString();
2.QueryString
querystring模塊用於處理HTTP請求URL中查詢字符串
var obj = qs.parse(str); 把查詢字符串解析js對象
var str = qs.stringify(obj) 把js對象轉換爲查詢字符串
3.URL
url模塊用於解析一個HTTP請求地址,獲取其中各個部分
var obj = url.parse(str); 把一個URL地址爲js對象
var obj = url.parse(str,true); 功能同上,並且把其中查詢字符串轉換
4.fs
文件:在node.js 我們系統文件或者目錄統稱爲文件
fs 模塊提供對文件和目錄進行,增刪改查,讀定文件內容
1.同步讀寫文件(阻塞)
#同步讀取文件內容 var data = fs.readFileSync(fileName);
#同步向文件寫內容 fs.writeFileSync(fileName,data);
注意:(1)如果當前寫入文件並不存在,自動創建一個
a.txt
(2)如果當前寫入目錄並不存在,報錯
d:/abc/a.txt
(3)如果當前文件己經存在內容,清空
#同步向文件追加內容
fs.appendFileSync(fileName,data);
2.異步讀寫文件(非阻塞)
#異步讀取數據 fs.readFile(fileName,function(err,data){ });
函數:文件讀取完成後調用
err:讀取文件不存在,權限不足,
自動創建錯誤對象
#異步寫數據 fs.writeFile(fileName,data,function(err){})
函數:文件寫結束調用
#異步追加數據 fs.appendFile(fileName,data,function(err){})
函數:文件追加結束
5.http
HTTP 模塊可用於編寫基於HTTP協議客戶端程序(即瀏覽器),也可以編寫一個基於HTTP協議服務器(APACHE)
用http模塊編寫一個web服務器
(1)創建服務器對象 var server = http.createServer();
(2)綁定監聽端口 1-65535 server.listen(3000);
(3)接收客戶端請求, server.on(“request”,(req,res)=>{..})
(4)並且響應客戶消息 res.end(str...);
req:請求對象:保存客戶端請求消息
req.url 請求url地址
res:響應對象:服務器發送數據客戶端,修改響應格式
三個常用對象:
1.server 代表服務器對象
2.req (request)請求對象,保存客戶端很多信息
req.url 客戶請求地址
req.method 客戶請求方式
req.httpVersion HTTP版本
req.headers 請求頭
3.res (response)響應對象,保存服務器端向客戶發送數據
res.statusCode = 200;
res.setHeader(); 設置響應頭
res.write(); 向客戶端輸入響應消息主體
res.end(); 通知客戶端,響應消息結束(只能一次)
常見錯誤:程序端口被佔用
listen EADDRINUSE :::3000
解決:查找前面程序停止即可
6.第三方模塊 (mysql/express)
mysql模塊:
SQL語句的分類
DDL:數據定義語句 CREATE/DROP/ALTER…
DCL:數據控制語句 GRANT…
DML:操作操作語句 INSERT/UPDATE/DELETE
DQL:查詢語句 SELECT
使用node.js訪問mysql服務器:使用工具 npm 下載第三方模塊(npm i mysql)
mysql模塊使用步驟:
(1)下載模塊
(2)加載mysql模塊 const mysql = require(“mysql”);
(3)創建到數據庫服務器連接 var conn = mysql.createConnection({})
(4)發送sql語句並且獲取服務器返回結果 conn.query(sql,(err,result)=>{});
(5)關閉連接 conn.end();
express模塊:
使用官方提供HTTP模塊可以創建一個web服務器應用,但此模塊非常底層,要處理各種情形,比較繁瑣。推薦使用HTTP高層模 塊,express—第三方模塊,是一個基於node.js http模塊的高層模塊,簡化服務器端開發。
使用步驟:
- 下載模塊 npm i express
- 加載相應模塊 http/express
- 創建express對象,再創建服務器對象,並且綁定監聽端口
var app = express();
var server = http.createServer(app);
server.listen(3000)
常規語法規則:
app.get(請求地址,回調函數);
#接收客戶請求 GET /index.html
app.get(“/index.html”,(req,res)=>{});
#接收客戶請求 POST /index.html
app.post(“/index.html”,(req,res)=>{});
1:express req和res對象
res.sendFile(__dirname+文件絕對路徑); =fs.read+res.write+res.end
res.send(向客戶端返回html字符串響應);
res.json(obj); =setHead()+JSON.parse()+res.write()+res.end()
2:express GET 請求 接收參數二種方法
#GET /login.do?uid=10&uname=tom
app.get(“/login.do”,(req,res)=>{
//express爲每一個req對象添加屬性query
req.query.uid;
req.query.uname;
});
#GET /login.do/12/tom
app.get(“/login.do/:uid/:uname”,(req,res)=>{
//express 爲每個req對象添加一個params 屬性
req.params.uid
req.params.uname
});
3:爲了項目提高效率à創建連接池
(1)創建連接池
var pool = mysql.createPool({…}); host;user;password;
connectionLimit:5 連接池中活動連接5個
建議範圍:5~25
(2)所有應用程序 租連接
pool.getConnection((err,conn)=>{ });
(3)歸還連接 conn.release();
4:請求方式:HTTP協議
請求方法:用於標識此次請求的目的
GET 表示客戶端想”獲得”指定資源
POST 表示客戶端想”上傳/添加”指定數據給服務器,請求數據在請求主體中
PUT 表示客戶端想”放置”數據在服務器
DELETE 表示客戶端想”刪除”服務器上指定資源
5:發送請求
瀏覽器發送GET請求
地址欄輸入url回車/表單GET/AJAX GET/超鏈接/js跳轉/img src
瀏覽器發送POST請求
表單POST/AJAX POST
瀏覽器發送DELETE請求
AJAX-DELETE
瀏覽器發送PUT請求
AJAX-PUT