這篇文章主要介紹“Node.js的基礎(chǔ)知識(shí)點(diǎn)有哪些”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“Node.js的基礎(chǔ)知識(shí)點(diǎn)有哪些”文章能幫助大家解決問(wèn)題。
站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到綏陽(yáng)網(wǎng)站設(shè)計(jì)與綏陽(yáng)網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋綏陽(yáng)地區(qū)。
Node.js
是一個(gè)調(diào)用內(nèi)置ApI
并且基于Chrome V8
引擎的js運(yùn)行環(huán)境,之前自己在本地總結(jié)了一些零散的只知識(shí)點(diǎn),今天整合一下發(fā)出來(lái)。
①基于 Express
框架,可以快速構(gòu)建 Web 應(yīng)用。
②基于 Electron
框架,可以構(gòu)建跨平臺(tái)的桌面應(yīng)用
③基于restify
框架,可以快速構(gòu)建 API 接口項(xiàng)目
④讀寫和操作數(shù)據(jù)庫(kù)
、創(chuàng)建實(shí)用的命令行工具輔助前端開(kāi)發(fā)、etc…
LTS:長(zhǎng)期穩(wěn)定版
Current:嘗鮮版
查看版本號(hào)
:node –v
學(xué)習(xí)路線:JavaScript 基礎(chǔ)語(yǔ)法 + Node.js 內(nèi)置 API 模塊(fs、path、http等)+ 第三方 API 模塊(express、MySQL 等)
命令
:node js文件名
終端快捷鍵:
①使用 ↑ 鍵,可以快速定位到上一次執(zhí)行的命令
②使用 tab 鍵,能夠快速補(bǔ)全路徑
③使用 esc 鍵,能夠快速清空當(dāng)前已輸入的命令
④輸入 cls 命令,可以清空終端
定義:把復(fù)雜問(wèn)題簡(jiǎn)單化,分成一個(gè)個(gè)小問(wèn)題。編程領(lǐng)域中的模塊化
,就是遵守固定的規(guī)則
,把一個(gè)大文件拆成獨(dú)立并互相依賴
的多個(gè)小模塊
把代碼進(jìn)行模塊化拆分的好處:
提高了代碼的復(fù)用性
提高了代碼的可維護(hù)性
可以實(shí)現(xiàn)按需加載
定義:由Node.js官方提供,如fs、http、path
// 引用內(nèi)部模塊
const fs = require('fs');
// 文件讀取
fs.readFile('../files/test-fs.txt', 'utf-8', (err, results) => {
if (err) return console.log(err.message);// 錯(cuò)誤信息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('寫入文件成功!');
})
注意點(diǎn)
readFile
只能讀取已經(jīng)存在的文件
writeFile
寫入內(nèi)容已經(jīng)有文件,則創(chuàng)建同名文件,再寫入文件
readFile
需要在writeFile
后面讀取,不然出錯(cuò)
node
命令自動(dòng)將當(dāng)前路徑和js腳本文件路徑
拼接,而不管.\day總復(fù)習(xí)這個(gè)路徑
我們可以使用絕對(duì)路徑
改善
./
表示當(dāng)前目錄 ../
表示父級(jí)目錄../..
表示祖父目錄
動(dòng)態(tài)拼接,首部不能出現(xiàn)./ ../
,否則拼接失敗/…/
定義:拼接絕對(duì)路徑
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
提供創(chuàng)建web服務(wù)器
// 導(dǎo)入http模塊
const http = require('http');
//創(chuàng)建web服務(wù)器實(shí)例
const server = http.createServer();
//綁定request事件,監(jiān)聽(tīng)客戶端請(qǐng)求
server.on('request', (req, res) => {
let str = `路徑 ${req.url} 方法 ${req.method}`;
console.log(str);
// 向客戶端發(fā)送中文前,設(shè)置響應(yīng)頭
res.setHeader('Content-Type', 'text/html;charset=utf-8');
res.end(str);
})
//啟動(dòng)服務(wù)器
server.listen(80, () => {
console.log('http://127.0.0.1');
})
根據(jù)瀏覽器訪問(wèn)的url地址
不同,返回相應(yīng)的絕對(duì)路徑
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的使用');
注意:自定義模塊開(kāi)頭必須有./ …/
定義:由第三方
提供,使用前需要下載
//下載外部導(dǎo)入
const moment = require('moment');
npm i nodemon -g
代替node
使用nodedmon
,每次修改內(nèi)容不需要重啟服務(wù)器,自動(dòng)監(jiān)聽(tīng)
模塊作用域定義
:和函數(shù)一致,當(dāng)前模塊定義的方法、變量,只能在當(dāng)前模塊
訪問(wèn),防止變量污染
暴露
:通過(guò)module.exports
或者exports
暴露出去,使用 require()
方法導(dǎo)入模塊時(shí),導(dǎo)入的結(jié)果,永遠(yuǎn)以module.exports
指向的對(duì)象為準(zhǔn)
定義: 一次加載緩存,從緩存加載
,內(nèi)置模塊
加載優(yōu)先級(jí)MAX
包:概念像node.js
的第三方模塊
,包是基于內(nèi)置模塊
封裝出來(lái)的,提供了更高級(jí)、更方便的 API
,極大的提高了開(kāi)發(fā)效率
npm: 包管理工具
npm安裝包
js導(dǎo)入包
根據(jù)開(kāi)發(fā)文檔使用包
// 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
包的版本號(hào)是以“點(diǎn)分十進(jìn)制”形式進(jìn)行定義的,總共有三位數(shù)字,例如 2.24.0
其中每一位數(shù)字所代表的的含義如下:
第1位數(shù)字:大版本
第2位數(shù)字:功能版本
第3位數(shù)字:Bug修復(fù)版本
版本號(hào)提升的規(guī)則:只要前面的版本號(hào)增長(zhǎng)了,則后面的版本號(hào)歸零。
npm i comment@2.22.2
node_modules
文件夾用來(lái)存放所有已安裝到項(xiàng)目中的包。require() 導(dǎo)入第三方包時(shí),就是從這個(gè)目錄中查找并加載包。
package-lock.json
配置文件用來(lái)記錄 node_modules 目錄下的每一個(gè)包的下載信息,例如包的名字、版本號(hào)、下載地址等。
package.json
項(xiàng)目的名稱、版本號(hào)、描述等、用到了哪些包、開(kāi)發(fā)期間使用的包、部署使用的包
devDependencies
:開(kāi)發(fā)依賴
dependencies
:核心依賴
注意:程序員不要手動(dòng)修改 node_modules 或 package-lock.json 文件中的任何代碼,npm 包管理工具會(huì)自動(dòng)維護(hù)它們,今后在項(xiàng)目開(kāi)發(fā)中,一定要把 node_modules 文件夾,添加到 .gitignore 忽略文件中
//安裝包
npm i moment
//安裝全局包
npm i 包名 -g
//安裝包到開(kāi)發(fā)階段到devDependencies
npm i 包名 -D
//安裝所有依賴包
npm install
//卸載包
npm uninstall moment
//查看已經(jīng)安裝的局部包
npm ls
//查看全局安裝的包
npm ls -g
//查看當(dāng)前npm鏡像
npm config get registry
//nrm鏡像工具,安裝為全局鏡像
nrm ls
//切換鏡像
nrm use taobao
一個(gè)規(guī)范的包,它的組成結(jié)構(gòu),必須符合以下 3 點(diǎn)要求:
包必須以單獨(dú)的目錄
而存在
包的頂級(jí)目錄下要必須包含 package.json
這個(gè)包管理配置文件
package.json 中必須包含 name,version,main
這三個(gè)屬性,分別代表包的名字、版本號(hào)、包的入口
發(fā)布包到npm
上
鏡像切換到npm上
npm login
登錄
發(fā)布包 npm publish
刪除包 npm unpublish 包名 --force
四、Express
Express
:基于Node.js http
進(jìn)一步封裝,更加高級(jí)的Web開(kāi)發(fā)框架
對(duì)于前端程序員來(lái)說(shuō),最常見(jiàn)的兩種服務(wù)器,分別是:
Web 網(wǎng)站服務(wù)器:專門對(duì)外提供 Web 網(wǎng)頁(yè)資源
的服務(wù)器
API 接口服務(wù)器:專門對(duì)外提供 API 接口
的服務(wù)器
//導(dǎo)入包
const express = require('express');
//創(chuàng)建服務(wù)器
const app = express();
app.get('/user', (req, res) => {
res.send({ 男: '18', age: 28 });
})
app.post('/user', (req, res) => {
res.send('post請(qǐng)求');
})
app.get('/', (req, res) => {
//req.query ?name=zs&age=18 這種數(shù)據(jù)
//http://127.0.0.1?name=zs&age=18
console.log(req.query);
})
app.post('/:id', (req, res) => {
//動(dòng)態(tài)匹配參數(shù)
console.log(req.params);
})
//啟動(dòng)服務(wù)器
app.listen(80, () => {
console.log('http://127.0.0.1');
})
定義
:通過(guò)路徑暴露文件,省去文件路徑的描寫
const express = require('express');
const app = express();
//托管靜態(tài)資源,不需要訪問(wèn)
app.use('/public', express.static('../files/clock'));
app.listen(80, () => {
console.log('http://127.0.0.1');
})
定義
:客戶端與服務(wù)器映射關(guān)系
//導(dǎo)入包
const express = require('express');
//創(chuàng)建服務(wù)器
const app = express();
app.get('/user', (req, res) => {
res.send({ 男: '18', age: 28 });
})
app.post('/user', (req, res) => {
res.send('post請(qǐng)求');
})
//啟動(dòng)服務(wù)器
app.listen(80, () => {
console.log('http://127.0.0.1');
})
為了方便對(duì)路由進(jìn)行模塊化的管理
,Express 不建議將路由直接掛載到 app 上,而是推薦將路由抽離為單獨(dú)的模塊
。
將路由抽離為單獨(dú)模塊的步驟
如下:
創(chuàng)建路由模塊
對(duì)應(yīng)的 .js
文件
調(diào)用express.Router()
函數(shù)創(chuàng)建路由對(duì)象
向路由對(duì)象上掛載具體的路由
使用 module.exports
向外共享路由對(duì)象
使用app.use()
函數(shù)注冊(cè)路由模塊
創(chuàng)建路由對(duì)象
const express = require('express');//導(dǎo)入包
const router = express.Router();//創(chuàng)建路由對(duì)象
//綁定路由規(guī)則
router.get('/user/list', (req, res) => {
res.send('user list message');
})
router.post('/user/add', (req, res) => {
res.send('user add message');
})
//向外導(dǎo)出路由對(duì)象
module.exports = router;
使用路由對(duì)象
const express = require('express');
const app = express();
const router = require('./11-模塊化路由');
app.use(router);
app.listen(80, () => {
console.log('http://127.0.0.1');
})
中間件:與路由處理函數(shù)不同,必須包含next參數(shù)
const express = require('express');
const app = express();
//全局中間件的簡(jiǎn)化形式
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');
})
注意
多個(gè)中間件共享req,res
,上游設(shè)置好,下游的中間件/路由使用
中間件
定義先后順序執(zhí)行
局部生效
的中間件,定義在
app.get('/',中間件,(req, res) => {
res.send('Get message');
})
路由之前
調(diào)用中間件
next()函數(shù)
不能忘,后面不用寫內(nèi)容
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()
實(shí)例上的中間件
定義:捕獲項(xiàng)目
錯(cuò)誤,防止出錯(cuò),在所有路由之后
定義
const express = require('express');
const app = express();
app.get('/', (req, res) => {
throw new Error('服務(wù)器出錯(cuò)');
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!服務(wù)器出錯(cuò)
const express = require('express');
const app = express();
// express.json()解析JSON請(qǐng)求體
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
導(dǎo)入
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 內(nèi)置的 express.urlencoded
中間件,就是基于 body-parser
這個(gè)第三方中間件進(jìn)一步封裝出來(lái)的。
封裝中間件
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;
測(cè)試中間件
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-接口問(wèn)題');
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 請(qǐng)求成功',
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 請(qǐng)求成功',
data: body
});
})
概念:由Http
響應(yīng)頭構(gòu)成,決定瀏覽器
是否阻止js代碼
獲取資源,在服務(wù)器端
配置
//只允許特定的域名訪問(wèn)、*代表全部
res.setHeader('Access-Control-Allow-Origin', 'http://www.baidu.com');
//配置請(qǐng)求頭信息
res.setHeader('Access-Control-Allow-Headers', 'Content-Type,X-Custom-Header');
//配置請(qǐng)求頭方法 * 代表全部
res.setHeader('Access-Control-Allow-Methods', 'GET,POST,DELETE,PUT');
請(qǐng)求方式:GET、POST、HEAD
HTTP 頭部信息不超過(guò)以下幾種字段:無(wú)自定義頭部字段
、Accept、Accept-Language、Content-Language、DPR、Downlink、Save-Data、Viewport-Width、Width 、Content-Type(只有三個(gè)值application/x-www-form-urlencoded、multipart/form-data、text/plain)
客戶端與服務(wù)器只發(fā)送一次請(qǐng)求
請(qǐng)求方式:GET、POST、HEAD之外的方式
自定義
頭部字段
OPTION預(yù)檢
,成功后發(fā)送帶有數(shù)據(jù)的請(qǐng)求
概念:只支持GET
請(qǐng)求
定義:組織
、存儲(chǔ)
、管理數(shù)據(jù)
的倉(cāng)庫(kù)
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
導(dǎo)包:npm i mysql
//引入mysql
const mysql = require('mysql');
//建立數(shù)據(jù)庫(kù)連接
const db = mysql.createPool({
url: '127.0.0.1',//數(shù)據(jù)庫(kù)IP地址
user: 'root',//賬號(hào)
password: '123456',//密碼
database: 'test_db'//操作哪一個(gè)數(shù)據(jù)庫(kù)
});
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總復(fù)習(xí)\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('插入數(shù)據(jù)成功');
}
})
//插入數(shù)據(jù)成功
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('更新數(shù)據(jù)成功');
}
})
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('刪除成功');
}
})
概念:服務(wù)端在后臺(tái)拼接html頁(yè)面
,發(fā)送給客戶端,不需要ajax
特點(diǎn):
前端耗時(shí)少
有利于SEO
占用服務(wù)端資源
不利于前后端分離開(kāi)發(fā)
概念:后端提供API
接口,前端通過(guò)ajax
調(diào)用接口
特點(diǎn):
開(kāi)發(fā)體驗(yàn)好
用戶體驗(yàn)好
減輕服務(wù)器渲染壓力
不利于SEO
不談業(yè)務(wù)場(chǎng)景而盲目選擇使用何種開(kāi)發(fā)模式都是耍流氓
比如企業(yè)級(jí)網(wǎng)站
,主要功能是展示而沒(méi)有復(fù)雜的交互,并且需要良好的 SEO
,則這時(shí)我們就需要使用服務(wù)器端渲染
而類似后臺(tái)管理項(xiàng)目
,交互性
比較強(qiáng),不需要考慮 SEO
,那么就可以使用前后端分離
的開(kāi)發(fā)模式
另外,具體使用何種開(kāi)發(fā)模式并不是絕對(duì)的,為了同時(shí)兼顧了首頁(yè)的渲染速度和前后端分離的開(kāi)發(fā)效率,一些網(wǎng)站采用了首屏服務(wù)器端渲染 + 其他頁(yè)面前后端分離
的開(kāi)發(fā)模式
概念:通過(guò)不同的手段(驗(yàn)證碼、密碼、人臉、指紋...
),認(rèn)證客戶的身份
Cookie:存儲(chǔ)在瀏覽器不超過(guò)4KB
字符串,鍵值對(duì)
形式存儲(chǔ)
自動(dòng)發(fā)送
域名獨(dú)立
過(guò)期時(shí)限
4KB限制
容易偽造,不建議存放隱私數(shù)據(jù)
核心:會(huì)員卡+pos機(jī)認(rèn)證
npm install express-session
關(guān)于“Node.js的基礎(chǔ)知識(shí)點(diǎn)有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。
分享文章:Node.js的基礎(chǔ)知識(shí)點(diǎn)有哪些
當(dāng)前URL:http://aaarwkj.com/article36/ipdgsg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、關(guān)鍵詞優(yōu)化、App設(shè)計(jì)、定制開(kāi)發(fā)、微信小程序、微信公眾號(hào)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)