您好,登錄后才能下訂單哦!
這篇文章主要介紹“Node.js的基礎知識點有哪些”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Node.js的基礎知識點有哪些”文章能幫助大家解決問題。
Node.js
是一個調用內置ApI
并且基于Chrome V8
引擎的js運行環境,之前自己在本地總結了一些零散的只知識點,今天整合一下發出來。
①基于 Express
框架,可以快速構建 Web 應用。
②基于 Electron
框架,可以構建跨平臺的桌面應用
③基于restify
框架,可以快速構建 API 接口項目
④讀寫和操作數據庫
、創建實用的命令行工具輔助前端開發、etc…
LTS:長期穩定版
Current:嘗鮮版
查看版本號
:node –v
學習路線:JavaScript 基礎語法 + Node.js 內置 API 模塊(fs、path、http等)+ 第三方 API 模塊(express、mysql 等)
命令
:node js文件名
終端快捷鍵:
①使用 ↑ 鍵,可以快速定位到上一次執行的命令
②使用 tab 鍵,能夠快速補全路徑
③使用 esc 鍵,能夠快速清空當前已輸入的命令
④輸入 cls 命令,可以清空終端
定義:把復雜問題簡單化,分成一個個小問題。編程領域中的模塊化
,就是遵守固定的規則
,把一個大文件拆成獨立并互相依賴
的多個小模塊
把代碼進行模塊化拆分的好處:
提高了代碼的復用性
提高了代碼的可維護性
可以實現按需加載
定義:由Node.js官方提供,如fs、http、path
// 引用內部模塊
const fs = require('fs');
// 文件讀取
fs.readFile('../files/test-fs.txt', 'utf-8', (err, results) => {
if (err) return console.log(err.message);// 錯誤信息err null
console.log(results);
})
// 文件寫入
fs.writeFile('../files/test-fs.txt', 'Node.js', 'utf-8', (err) => {
if (err) return console.log(err.message);
console.log('寫入文件成功!');
})
注意點
readFile
只能讀取已經存在的文件
writeFile
寫入內容已經有文件,則創建同名文件,再寫入文件
readFile
需要在writeFile
后面讀取,不然出錯
node
命令自動將當前路徑和js腳本文件路徑
拼接,而不管.\day總復習這個路徑
我們可以使用絕對路徑
改善
./
表示當前目錄 ../
表示父級目錄../..
表示祖父目錄
動態拼接,首部不能出現./ ../
,否則拼接失敗 /…/
定義:拼接絕對路徑
path.join()
path.basename()
path.extname()
const fs = require('fs');
const path = require('path');
const fpath = path.join(__dirname, '/../files/test-fs.txt');
fs.readFile(fpath, 'utf-8', (err, results) => {
console.log(__dirname);
console.log(path.basename(fpath, '.txt'));
console.log(path.extname(fpath));
if (err) return console.log(err.message);
console.log(results);
})
// test-fs
// .txt
// Node.js
定義:Node.js
提供創建web服務器
// 導入http模塊
const http = require('http');
//創建web服務器實例
const server = http.createServer();
//綁定request事件,監聽客戶端請求
server.on('request', (req, res) => {
let str = `路徑 ${req.url} 方法 ${req.method}`;
console.log(str);
// 向客戶端發送中文前,設置響應頭
res.setHeader('Content-Type', 'text/html;charset=utf-8');
res.end(str);
})
//啟動服務器
server.listen(80, () => {
console.log('http://127.0.0.1');
})
根據瀏覽器訪問的url地址
不同,返回相應的絕對路徑
const fs = require('fs');
const http = require('http');
const path = require('path');
const server = http.createServer();
let fpath = '';
server.on('request', (req, res) => {
if (req.url === '/') {
fpath = path.join(__dirname + '/../files/clock/index.html');
console.log(__dirname);
console.log(fpath);
}
else {
fpath = path.join(__dirname + '/../files/clock' + req.url);
}
fs.readFile(fpath, 'utf-8', (err, results) => {
if (err) res.end('404 not find');
res.end(results);
})
})
server.listen(80, () => {
console.log('http://127.0.0.1');
})
定義:用戶自定義的js模塊
//引入本地文件
const custom = require('./01-node.js的使用');
注意:自定義模塊開頭必須有./ …/
定義:由第三方
提供,使用前需要下載
//下載外部導入
const moment = require('moment');
npm i nodemon -g
代替node
使用nodedmon
,每次修改內容不需要重啟服務器,自動監聽
模塊作用域定義
:和函數一致,當前模塊定義的方法、變量,只能在當前模塊
訪問,防止變量污染
暴露
:通過module.exports
或者exports
暴露出去,使用 require()
方法導入模塊時,導入的結果,永遠以module.exports
指向的對象為準
定義: 一次加載緩存,從緩存加載
,內置模塊
加載優先級MAX
包:概念像node.js
的第三方模塊
,包是基于內置模塊
封裝出來的,提供了更高級、更方便的 API
,極大的提高了開發效率
npm: 包管理工具
npm安裝包
js導入包
根據開發文檔使用包
// npm i moment
const moment = require('moment');
const date = moment().format('YYYY-MM-DD HH:mm:ss');
console.log(date);//2022-09-10 10:43:24
包的版本號是以“點分十進制”形式進行定義的,總共有三位數字,例如 2.24.0
其中每一位數字所代表的的含義如下:
第1位數字:大版本
第2位數字:功能版本
第3位數字:Bug修復版本
版本號提升的規則:只要前面的版本號增長了,則后面的版本號歸零。
npm i comment@2.22.2
node_modules
文件夾用來存放所有已安裝到項目中的包。require() 導入第三方包時,就是從這個目錄中查找并加載包。
package-lock.json
配置文件用來記錄 node_modules 目錄下的每一個包的下載信息,例如包的名字、版本號、下載地址等。
package.json
項目的名稱、版本號、描述等、用到了哪些包、開發期間使用的包、部署使用的包
devDependencies
:開發依賴
dependencies
:核心依賴
注意:程序員不要手動修改 node_modules 或 package-lock.json 文件中的任何代碼,npm 包管理工具會自動維護它們,今后在項目開發中,一定要把 node_modules 文件夾,添加到 .gitignore 忽略文件中
//安裝包
npm i moment
//安裝全局包
npm i 包名 -g
//安裝包到開發階段到devDependencies
npm i 包名 -D
//安裝所有依賴包
npm install
//卸載包
npm uninstall moment
//查看已經安裝的局部包
npm ls
//查看全局安裝的包
npm ls -g
//查看當前npm鏡像
npm config get registry
//nrm鏡像工具,安裝為全局鏡像
nrm ls
//切換鏡像
nrm use taobao
一個規范的包,它的組成結構,必須符合以下 3 點要求:
包必須以單獨的目錄
而存在
包的頂級目錄下要必須包含 package.json
這個包管理配置文件
package.json 中必須包含 name,version,main
這三個屬性,分別代表包的名字、版本號、包的入口
發布包到npm
上
鏡像切換到npm上
npm login
登錄
發布包 npm publish
刪除包 npm unpublish 包名 --force
四、Express
Express
:基于Node.js http
進一步封裝,更加高級的Web開發框架
對于前端程序員來說,最常見的兩種服務器,分別是:
Web 網站服務器:專門對外提供 Web 網頁資源
的服務器
API 接口服務器:專門對外提供 API 接口
的服務器
//導入包
const express = require('express');
//創建服務器
const app = express();
app.get('/user', (req, res) => {
res.send({ 男: '18', age: 28 });
})
app.post('/user', (req, res) => {
res.send('post請求');
})
app.get('/', (req, res) => {
//req.query ?name=zs&age=18 這種數據
//http://127.0.0.1?name=zs&age=18
console.log(req.query);
})
app.post('/:id', (req, res) => {
//動態匹配參數
console.log(req.params);
})
//啟動服務器
app.listen(80, () => {
console.log('http://127.0.0.1');
})
定義
:通過路徑暴露文件,省去文件路徑的描寫
const express = require('express');
const app = express();
//托管靜態資源,不需要訪問
app.use('/public', express.static('../files/clock'));
app.listen(80, () => {
console.log('http://127.0.0.1');
})
定義
:客戶端與服務器映射關系
//導入包
const express = require('express');
//創建服務器
const app = express();
app.get('/user', (req, res) => {
res.send({ 男: '18', age: 28 });
})
app.post('/user', (req, res) => {
res.send('post請求');
})
//啟動服務器
app.listen(80, () => {
console.log('http://127.0.0.1');
})
為了方便對路由進行模塊化的管理
,Express 不建議將路由直接掛載到 app 上,而是推薦將路由抽離為單獨的模塊
。
將路由抽離為單獨模塊的步驟
如下:
創建路由模塊
對應的 .js
文件
調用express.Router()
函數創建路由對象
向路由對象上掛載具體的路由
使用 module.exports
向外共享路由對象
使用app.use()
函數注冊路由模塊
創建路由對象
const express = require('express');//導入包
const router = express.Router();//創建路由對象
//綁定路由規則
router.get('/user/list', (req, res) => {
res.send('user list message');
})
router.post('/user/add', (req, res) => {
res.send('user add message');
})
//向外導出路由對象
module.exports = router;
使用路由對象
const express = require('express');
const app = express();
const router = require('./11-模塊化路由');
app.use(router);
app.listen(80, () => {
console.log('http://127.0.0.1');
})
中間件:與路由處理函數不同,必須包含next參數
const express = require('express');
const app = express();
//全局中間件的簡化形式
app.use((req, res, next) => {
console.log('正在使用全局中間件');
next();
});
app.get('/',(req, res) => {
res.send('Get message');
})
app.listen(80, () => {
console.log('http://127.0.0.1');
})
注意
多個中間件共享req,res
,上游設置好,下游的中間件/路由使用
中間件
定義先后順序執行
局部生效
的中間件,定義在
app.get('/',中間件,(req, res) => {
res.send('Get message');
})
路由之前
調用中間件
next()函數
不能忘,后面不用寫內容
const express = require('express');
const app = express();
//全局中間件
app.use((req, res, next) => {
console.log('全局中間件');
next();
})
//局部中間件
function mw(req, res, next) {
console.log('局部中間件');
next();
}
app.get('/', mw, (req, res) => {
res.send('server is visting');
})
app.listen(80, () => {
console.log('http://127.0.0.1');
})
定義:綁定到 express.Router()
實例上的中間件
定義:捕獲項目
錯誤,防止出錯,在所有路由之后
定義
const express = require('express');
const app = express();
app.get('/', (req, res) => {
throw new Error('服務器出錯');
res.send('server is visting');
})
//全局中間件
app.use((err, req, res, next) => {
console.log('Error!' + err.message);
res.send('Error!' + err.message);
next();
})
app.listen(80, () => {
console.log('http://127.0.0.1');
})
//Error!服務器出錯
const express = require('express');
const app = express();
// express.json()解析JSON請求體
app.use(express.json());
//解析application/x-www-
app.use(express.urlencoded({ extended: false }));
app.post('/user', (req, res) => {
console.log(req.body);
})
app.post('/book', (req, res) => {
console.log(req.body);
})
app.listen(80, () => {
console.log('http://127.0.0.1');
})
// http://127.0.0.1
// { name: 'zs', age: 18 }
// [Object: null prototype] { name: '西游記' }
npm install body-parse
require
導入
app.use()
為全局
const express = require('express');
const app = express();
const parser = require('body-parser');
app.use(parser.urlencoded({ extended: false }));
app.post('/book', (req, res) => {
console.log(req.body);
})
app.listen(80, () => {
console.log('http://127.0.0.1');
})
注意:Express 內置的 express.urlencoded
中間件,就是基于 body-parser
這個第三方中間件進一步封裝出來的。
封裝中間件
const querystring = require('querystring');
function parsebody(req, res, next) {
let str = '';
req.on('data', (result) => {
str += result;
})
req.on('end', () => {
const body = querystring.parse(str);
req.body = body;
next();
})
}
module.exports = parsebody;
測試中間件
const express = require('express');
const app = express();
const parsebody = require('./14-自定義中間件');
app.use(parsebody);
app.post('/user', (req, res) => {
res.send(req.body);
console.log(req.body);
})
app.listen(80, () => {
console.log('http://127.0.0.1');
})
const express = require('express');
const app = express();
const router = require('./15-接口問題');
app.use(router);
app.listen(80, () => {
console.log('http://127.0.0.1');
})
const express = require('express');
const apiRouter = express.Router();
apiRouter.get('/user', (req, res) => {
const query = req.query;
res.send({
status: 0,
msg: 'GET 請求成功',
data: query
});
})
module.exports = apiRouter;
apiRouter.use(express.urlencoded({ extended: false }));
apiRouter.post('/user', (req, res) => {
const body = req.body;
res.send({
status: 0,
msg: 'POST 請求成功',
data: body
});
})
概念:由Http
響應頭構成,決定瀏覽器
是否阻止js代碼
獲取資源,在服務器端
配置
//只允許特定的域名訪問、*代表全部
res.setHeader('Access-Control-Allow-Origin', 'http://www.baidu.com');
//配置請求頭信息
res.setHeader('Access-Control-Allow-Headers', 'Content-Type,X-Custom-Header');
//配置請求頭方法 * 代表全部
res.setHeader('Access-Control-Allow-Methods', 'GET,POST,DELETE,PUT');
請求方式:GET、POST、HEAD
HTTP 頭部信息不超過以下幾種字段:無自定義頭部字段
、Accept、Accept-Language、Content-Language、DPR、Downlink、Save-Data、Viewport-Width、Width 、Content-Type(只有三個值application/x-www-form-urlencoded、multipart/form-data、text/plain)
客戶端與服務器只發送一次請求
請求方式:GET、POST、HEAD之外的方式
自定義
頭部字段
OPTION預檢
,成功后發送帶有數據的請求
概念:只支持GET
請求
定義:組織
、存儲
、管理數據
的倉庫
select * from userswhere id>1 and id <5
insert into users(username,password) values('jack','666')
update users set password='666666'where username='jack'
delete from users
where id=9
導包:npm i mysql
//引入mysql
const mysql = require('mysql');
//建立數據庫連接
const db = mysql.createPool({
url: '127.0.0.1',//數據庫IP地址
user: 'root',//賬號
password: '123456',//密碼
database: 'test_db'//操作哪一個數據庫
});
const queryStr = 'select * from users';
db.query(queryStr, (err, results) => {
if (err) return console.log(err.message);
console.log(results);
})
PS E:\FED\js\node.js\node.js—資料\day總復習\code> node .\18-mysql操作.js
[
RowDataPacket { id: 1, username: 'zz', password: '123', status: 0 },
RowDataPacket { id: 2, username: 'ls', password: 'abc', status: 0 },
RowDataPacket { id: 4, username: 'jony', password: '456', status: 0 }
]
const user = { username: 'superman', password: 'jknad' };
const insertStr = 'insert into users set ?';
db.query(insertStr, user, (err, results) => {
if (err) return console.log(err.message);
if (results.affectedRows == 1) {
console.log('插入數據成功');
}
})
//插入數據成功
const user = { id: 10, username: 'super', password: '123456' };
const updateStr = 'update users set ? where id=?';
db.query(updateStr, [user, user.id], (err, results) => {
if (err) return console.log(err.message);
if (results.affectedRows == 1) {
console.log('更新數據成功');
}
})
const deleteStr = 'delete from users where id=?';
db.query(deleteStr, 10, (err, results) => {
if (err) return console.log(err.message);
if (results.affectedRows == 1) {
console.log('刪除成功');
}
})
const deleteStr = 'update users set status=1 where id=?';
db.query(deleteStr, 10, (err, results) => {
if (err) return console.log(err.message);
if (results.affectedRows == 1) {
console.log('刪除成功');
}
})
概念:服務端在后臺拼接html頁面
,發送給客戶端,不需要ajax
特點:
前端耗時少
有利于SEO
占用服務端資源
不利于前后端分離開發
概念:后端提供API
接口,前端通過ajax
調用接口
特點:
開發體驗好
用戶體驗好
減輕服務器渲染壓力
不利于SEO
不談業務場景而盲目選擇使用何種開發模式都是耍流氓
比如企業級網站
,主要功能是展示而沒有復雜的交互,并且需要良好的 SEO
,則這時我們就需要使用服務器端渲染
而類似后臺管理項目
,交互性
比較強,不需要考慮 SEO
,那么就可以使用前后端分離
的開發模式
另外,具體使用何種開發模式并不是絕對的,為了同時兼顧了首頁的渲染速度和前后端分離的開發效率,一些網站采用了首屏服務器端渲染 + 其他頁面前后端分離
的開發模式
概念:通過不同的手段(驗證碼、密碼、人臉、指紋...
),認證客戶的身份
Cookie:存儲在瀏覽器不超過4KB
字符串,鍵值對
形式存儲
自動發送
域名獨立
過期時限
4KB限制
容易偽造,不建議存放隱私數據
核心:會員卡+pos機認證
npm install express-session
關于“Node.js的基礎知識點有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。