一、nrm
安裝
參考地址:https://www.cnblogs.com/wangmeijian/p/7072053.html
二、express框架
安裝
菜鳥教程參考網(wǎng)址:
https://www.runoob.com/nodejs/nodejs-express-framework.html
一、Express框架 Day05
1.課程介紹
- Express介紹(了解)
- Express安裝及使用(掌握)
- Express路由(掌握)
- response響應(yīng)對象(掌握)
- request請求對象(掌握)
- 中間件(了解)
2.Express介紹
Express 是一個基于 Node.js 平臺的極簡、靈活的 web 應(yīng)用開發(fā)框架,它提供一系列強(qiáng)大的特性,幫助你創(chuàng)建各種 Web 和移動設(shè)備應(yīng)用。
Express 框架核心特性:
- 可以設(shè)置中間件來響應(yīng) HTTP 請求。
- 定義了路由表用于執(zhí)行不同的 HTTP 請求動作。
(url = 資源) 映射 - 可以通過向模板傳遞參數(shù)來動態(tài)渲染 HTML 頁面。 模板引擎
3.Express使用
3.1.簡單使用(了解)
1、新建一個NodeJs項目文件夾
2、npm init 初始化項目配置文件(package.json 包描述文件)
package.json中
"scripts": {
//命令
"start":"node ./index"
}
npm start 執(zhí)行”start”后面的代碼。
3、安裝express
npm install express --save
4、編寫一個app.js使用express
//導(dǎo)入express模塊
var express = require("express");
//創(chuàng)建一個express應(yīng)用
var app = express();
//處理"/"請求
app.get("/",function(req,res){
//響應(yīng)輸出“hello world”
res.send("Hello world");
});
//啟動服務(wù)器監(jiān)聽3000端口
app.listen(3000,function(){
console.log("express app 啟動成功。。。");
});
5、啟動服務(wù)器
node app.js
6、瀏覽器訪問

3.2.Express-generator(重點(diǎn))
為了快速的創(chuàng)建express項目,express團(tuán)隊為使用者提供了項目快速生成工具,express-generator。
1、安裝express-generator
npm i express-generator -g //全局安裝
2、新建一個目錄(或者找一個空目錄)
F:\webproject (目錄可以新建在任何位置,但最好不要中文路徑)
3、通過命令創(chuàng)建express項目
express -e projecname (express代表在當(dāng)前目錄下面建立express項目 -e代表使用ejs模版引擎)
express webapp (代表在當(dāng)前目錄下面,新建一個webapp文件夾,然后在建立express項目)

項目結(jié)構(gòu):
bin : 執(zhí)行文件,也是express項目啟動文件。
public:公共的資源,瀏覽器可以直接訪問的資源。(圖片,js,css)
views:服務(wù)器端模塊文件。
routes:路由處理器,處理瀏覽器發(fā)出不同url的處理程序。
/login function(){
//登錄處理程序
}
app.js express應(yīng)用的主文件,該文件主要用于整合其他第三方模塊和配置express的系統(tǒng)參數(shù)。
4、安裝依賴包
通過package.json
"dependencies": {
"body-parser": "~1.15.1",
"cookie-parser": "~1.4.3",
"debug": "~2.2.0",
"ejs": "~2.4.1",
"express": "~4.13.4",
"morgan": "~1.7.0",
"serve-favicon": "~2.3.0"
}
npm i

5、啟動express
node app 需要設(shè)置監(jiān)聽端口
npm start
node ./bin/www

6、瀏覽器訪問

3.3.Express服務(wù)器項目結(jié)構(gòu)說明
bin: 執(zhí)行文件,也是express項目啟動文件。
public: 公共的資源(nodejs不做處理),瀏覽器可以直接訪問的資源,相當(dāng)于靜態(tài)網(wǎng)頁的根目錄,訪問時不需加路徑。(圖片,js,css)
http://localhost:3000/test.html
http://localhost:3000/images/img.jpg
views: 服務(wù)器端模塊或模板文件。
routes: 路由處理器,處理瀏覽器發(fā)出不同url的處理程序。動態(tài)網(wǎng)頁的目錄
app.js 主模塊文件,是總路由,分支路由寫在routes目錄下
package.json 包管理,依賴包
//引入系統(tǒng)和第三方模塊
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
//引入路由
var index = require('./routes/index');
var users = require('./routes/users');
var vipCenter=require("./routes/vip");
//實(shí)例化express框架
var app = express();
// view engine setup
//設(shè)置模板的默認(rèn)目錄
app.set('views', path.join(__dirname, 'views'));
//設(shè)置ejs為模板引擎
app.set('view engine', 'ejs');
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
//中間件
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
//設(shè)置靜態(tài)目錄為public
app.use(express.static(path.join(__dirname, 'public')));
//使用分路由
app.use('/', index);
app.use('/users', users);
app.use("/vip",vipCenter);
// catch 404 and forward to error handler
//404找不到
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handler
//錯誤
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
//導(dǎo)出模塊
module.exports = app;
4. Express路由(重點(diǎn))
路由是指如何定義應(yīng)用的端點(diǎn)(URIs)以及如何響應(yīng)客戶端的請求。
路由是由一個 URI、HTTP 請求(GET、POST等)和若干個句柄(函數(shù))組成,它的結(jié)構(gòu)如下: app.METHOD(path, [callback...], callback), app 是 express 對象的一個實(shí)例, METHOD 是一個 HTTP 請求方法, path 是服務(wù)器上的路徑, callback 是當(dāng)路由匹配時要執(zhí)行的函數(shù)。
4.1. 基礎(chǔ)用法
var express = require('express');
var app = express();
//設(shè)置請求路徑“/”對應(yīng)的處理器
app.get('/', function(req, res) {
res.send('hello world');
});
4.2. 路由方法
路由與HTTP 請求方法(GET、POST)相關(guān)聯(lián)。
為應(yīng)用“/”路徑定義的 GET 和 POST 請求:
// 處理get請求方式,超鏈接、瀏覽器地址欄直接訪問
app.get('/', function (req, res) {
res.send('處理get請求');
});
// 處理post請求方式,表單提交
app.post('/', function (req, res) {
res.send('處理post請求');
});
app.all() 是一個特殊的路由方法,沒有任何 HTTP 方法與其對應(yīng),它的作用是對于一個路徑上的所有請求加載中間件。 all相當(dāng)于既可以處理GET,也可以處理POST。
app.all('/, function (req, res, next) {
res.send('任意方式的請求');
});
4.3. Router(重點(diǎn)中的重點(diǎn))
express.Router 類可以創(chuàng)建模塊化(獨(dú)立的)、可掛載的路由對象。Router 對象是一個完整的中間件和路由系統(tǒng),因此常稱其為一個 “mini-app”。
1、新建一個模塊vip.js (express項目要求我們放到routes)
var express = require('express');
var router = express.Router();
// 定義模塊的主頁的路由
router.get('/', function(req, res) {
res.send('vip首頁');
});
// 定義模塊“/getScore”路徑的路由
router.get('/getScore', function(req, res) {
res.send('vip積分');
});
module.exports = router;
2、app.js 使用
var vip = require('./vip);
...
app.use('/vip', vip); // 路徑“/vip”使用vip路由模塊,這個行為就是把“vip”模塊掛載到“/vip”路徑下面。
? **訪問**
[<u>http://localhost:3000/vip</u>](http://localhost:3000/vip)/ //vip首頁
[<u>http://localhost:3000/vip</u>](http://localhost:3000/vip)/getScore //vip積分
5. 響應(yīng)對象(重點(diǎn))
響應(yīng)對象(res)的方法向客戶端返回響應(yīng),終結(jié)請求響應(yīng)的循環(huán)。如果在路由函數(shù)中一個方法也不調(diào)用,來自客戶端的請求會一直掛起。
5.1. send方法(重點(diǎn)中的重點(diǎn))
send(data) 可以返回任意類型數(shù)據(jù)。
res.send(new Buffer('whoop'));//流
res.send({ some: 'json' });// json數(shù)據(jù)
res.send('<p>some html</p>');//普通文本
//設(shè)置狀態(tài)碼,并且返回內(nèi)容
res.status(404).send('Sorry, we cannot find that!');
res.status(500).send({ error: 'something blew up' });
5.2. json方法
json(data) 返回json對象,一般針對ajax應(yīng)用。
res.json(null);
res.json({ user: 'tobi' });
//設(shè)置狀態(tài)碼,并返回json數(shù)據(jù)
res.status(500).json({ error: 'message' });
5.3. jsonp方法
jsonp(data) 返回json對象,一般針對ajax的跨域訪問。
res.jsonp(null);
res.jsonp({ user: 'tobi' });
//設(shè)置狀態(tài)碼,并返回json數(shù)據(jù)
res.status(500).jsonp({ error: 'message' });
5.4.render視圖模板
ejs模板的使用
index.ejs 模板
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
<link rel='stylesheet' href='/stylesheets/style.css' />
</head>
<body>
<ul id="mainNav">
<li><a href="/">首頁</a></li>
<li><a href="/news">新聞中心</a></li>
<li><a href="/vip">vip會員中心</a></li>
<li><a href="/users">用戶注冊</a></li>
</ul>
<h1><%= title %></h1>
<p>Welcome to <%= title %></p>
</body>
</html>
index.js 路由
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' }); //將視圖和數(shù)據(jù)合并后發(fā)送給客戶端
});
5.5.download下載
//下載當(dāng)前目錄下面的xxx.doc文件,并且重命名為yyy.doc。
router.get('/down', function(req, res, next) {
res.download("./downTest.doc","express使用說明.doc")
});
5.6.redirect重定向
重定向到從指定的URL路徑(瀏覽器地址變?yōu)樵O(shè)置的地址)
router.get('/it', function(req, res, next) {
res.redirect("http://www.baidu.cn");
});
5.7.404報錯頁面制作

router.get('/err', function(req, res, next) {
//res.status(404).send("出錯了:文件沒有找到!");
res.status(404).render("error",{message:"很抱歉,您查看的寶貝不存在,可能已下架或者被轉(zhuǎn)移。"});
});
error.ejs
<h1><%= message %></h1>
<p><img src="./images/err.png" /></p>
5.8.完整api
1.res.app:同req.app一樣
2.res.append():追加指定HTTP頭
3.res.set()在res.append()后將重置之前設(shè)置的頭
4.res.cookie(name,value [,option]):設(shè)置Cookie
opition: domain / expires / httpOnly / maxAge / path / secure / signed
5.res.clearCookie():清除Cookie
npm install cookie
var cookie=require("cookie");
res.cookie("username",username); // 設(shè)置cookie
req.cookies.名稱 // 取值
res.clearCookie(‘名稱’); // 清除指定名稱的Cookie
手動清除cookie,設(shè)置》高級》清除瀏覽數(shù)據(jù)
router.get("/checkLogin",function(req,res,next){
var username=req.cookies.username;
if(username) {
res.send(true);
}
else{
res.send(false);
}
});

res.download():傳送指定路徑的文件
res.get():返回指定的HTTP頭
res.json():傳送JSON響應(yīng)
res.jsonp():傳送JSONP響應(yīng)
res.location():只設(shè)置響應(yīng)的Location HTTP頭,不設(shè)置狀態(tài)碼或者close response
res.redirect():設(shè)置響應(yīng)的Location HTTP頭,并且設(shè)置狀態(tài)碼302
res.send():傳送HTTP響應(yīng)
res.sendFile(path [,options] [,fn]):傳送指定路徑的文件 -會自動根據(jù)文件extension設(shè)定Content-Type
res.set():設(shè)置HTTP頭,傳入object可以一次設(shè)置多個頭
res.status():設(shè)置HTTP狀態(tài)碼
res.type():設(shè)置Content-Type的MIME類型
6. 請求對象(重點(diǎn))
req(request)對象包含了數(shù)一次請求中的所有據(jù)(http頭信息、請求參數(shù)...)
6.1. 獲取瀏覽器地址欄中的參數(shù)(重點(diǎn)中的重點(diǎn))
語法: req.query.參數(shù)名;
比如:http://localhost:3000/user?name=007
req.query.name;
**搜索功能**
search.html?keywords=筆記本電腦&catetype=it數(shù)碼
router.get('/search.html', function(req, res, next) {
var keywords=req.query.keywords;
var catetype=req.query.catetype;
res.json({"關(guān)鍵詞":keywords,"類別":catetype});
});
6.2. 獲取表單提交的值(重點(diǎn)中的重點(diǎn))
Post提交 req.body.參數(shù)名
Get提交 req.query.參數(shù)名;
login.htmlpublic靜態(tài)文件
<form action="/loginPost" method="post">
<p>用戶賬號 <input type="text" name="username" /></p>
<p>登錄密碼 <input type="password" name="pwd" /></p>
<p><input type="submit" value="Post登錄" /> </p>
</form>
<hr/>
<form action="/loginGet" method="get">
<p>用戶賬號 <input type="text" name="username" /></p>
<p>登錄密碼 <input type="password" name="pwd" /></p>
<p><input type="submit" value="Get登錄" /> </p>
</form>
路由文件
router.get('/loginGet', function(req, res, next) {
var username=req.query.username;
var pwd=req.query.pwd;
res.json({"賬號":username,"密碼":pwd});
});
router.post('/loginPost', function(req, res, next) {
var username=req.body.username;
var pwd=req.body.pwd;
res.json({"賬號":username,"密碼":pwd});
});
6.3. 獲取路由中的參數(shù)parameters
京東的產(chǎn)品地址:<u>https://item.jd.com/5268701.html</u>
/product/9999
router.get("/product/:id",function(req,res){
var productID=req.params.id;
res.send("產(chǎn)品的編號是:"+productID);
});
parameter [p??r?m?t?] params [p??r?ms]
偽靜態(tài): 看起來是一個靜態(tài)文件,但其實(shí)是動態(tài)的。好處可以方便搜索引擎收錄
6.4. 獲取ip地址
router.get('/home', function(req, res, next) {
res.send("<h1>我是首頁homepage!!!</h1><p>你的ip地址是:"+req.hostname+"_"+req.ip+"</p>");
});
6.5. 完整api
req.app:當(dāng)callback為外部文件時,用req.app訪問express的實(shí)例
req.baseUrl:獲取路由當(dāng)前安裝的URL路徑
req.body / req.cookies:獲得「請求主體」/ Cookies
req.fresh / req.stale:判斷請求是否還「新鮮」
req.hostname / req.ip:獲取主機(jī)名和IP地址
req.originalUrl:獲取原始請求URL
req.params:獲取路由的parameters
req.path:獲取請求路徑
req.protocol:獲取協(xié)議類型
req.query:獲取URL的查詢參數(shù)串
req.route:獲取當(dāng)前匹配的路由
req.subdomains:獲取子域名
req.accpets():檢查請求的Accept頭的請求類型
req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages
req.get():獲取指定的HTTP請求頭
req.is():判斷請求頭Content-Type的MIME類型
7. 中間件(了解)
Express 是一個自身功能極簡,完全是由路由和中間件構(gòu)成一個的 web 開發(fā)框架:從本質(zhì)上來說,一個 Express 應(yīng)用就是在調(diào)用各種中間件。

7.1.中間件到底是什么
中間件(Middleware)本質(zhì)就是一個函數(shù),它可以訪問請求對象(request object), 響應(yīng)對象(response object), 和 web 應(yīng)用中處于請求-響應(yīng)循環(huán)流程中的中間件,一般被命名為 next 的變量。(next 尾函數(shù),執(zhí)行下一個任務(wù))
中間件的功能包括:
執(zhí)行任何代碼。
修改請求和響應(yīng)對象。
終結(jié)請求-響應(yīng)循環(huán)。
調(diào)用堆棧中的下一個中間件。
如果當(dāng)前中間件沒有終結(jié)請求-響應(yīng)循環(huán),則必須調(diào)用 next() 方法將控制權(quán)交給下一個中間件,否則請求就會掛起。
7.2.應(yīng)用級中間件
應(yīng)用級中間件綁定到 app 對象 使用 app.use() 和 app.METHOD(), 其中, METHOD 是需要處理的 HTTP 請求的方法,例如 GET, PUT, POST 等等,全部小寫。
//最簡單的中間件
app.js
var express = require('express');
var app = express();
…………………………. ………………………….
/*
- 中間件:
- 中間件是一個函數(shù)
- 中間件可以訪問請求對象和響應(yīng)對象
- 可以阻止請求繼續(xù)執(zhí)行,如果不阻止,可以調(diào)用尾函數(shù) next()
- 尾函數(shù)next:
- 在一個中間件中執(zhí)行尾函數(shù),就可以調(diào)用下一個中間件
- 如果不用調(diào)用尾函數(shù),就阻止執(zhí)行
- 在尾函數(shù)后面的代碼會執(zhí)行,并且是在尾函數(shù)調(diào)起的下一個中間件結(jié)束后才執(zhí)行
*/
- 在尾函數(shù)后面的代碼會執(zhí)行,并且是在尾函數(shù)調(diào)起的下一個中間件結(jié)束后才執(zhí)行
app.use(function(req,res,next){
console.log('111');
next();
console.log('222');
});
app.use(function(req,res,next){
console.log('333');
next();
console.log('444');
});
…………………………. ………………………….
module.exports = app;
7.3.內(nèi)置中間件
Express中只為我們提供了唯一一個中間件,其他的中間件需要安裝。
| 屬性 | 描述 | 類型 | 缺省值 |
|---|---|---|---|
| dotfiles | 是否對外輸出文件名以點(diǎn)(.)開頭的文件??蛇x值為 “allow”、“deny” 和 “ignore” | String | “ignore” |
| etag | 是否啟用 etag 生成 | Boolean | true |
| extensions | 設(shè)置文件擴(kuò)展名備份選項 | Array | [] |
| index | 發(fā)送目錄索引文件,設(shè)置為 false 禁用目錄索引。 | Mixed | “index.html” |
| lastModified | 設(shè)置 Last-Modified 頭為文件在操作系統(tǒng)上的最后修改日期。可能值為 true 或 false。 | Boolean | true |
| maxAge | 以毫秒或者其<u>字符串格式</u>設(shè)置 Cache-Control 頭的 max-age 屬性。 | Number | 0 |
| redirect | 當(dāng)路徑為目錄時,重定向至 “/”。 | Boolean | true |
| setHeaders | 設(shè)置 HTTP 頭以提供文件的函數(shù)。 | Function |
下面的例子使用了 express.static 中間件,其中的 options 對象經(jīng)過了精心的設(shè)計。
var options = {
dotfiles: 'ignore',
etag: false,
extensions: ['htm', 'html'],
index: false,
maxAge: '1d',
redirect: false,
setHeaders: function (res, path, stat) {
res.set('x-timestamp', Date.now());
}}
app.use(express.static('public', options));
每個應(yīng)用可有多個靜態(tài)目錄。
app.use(express.static('public'));
app.use(express.static('uploads'));
app.use(express.static('files'));
app.use(logger('dev')); //控制臺日志顯示的中間件
app.use(express.static(path.join(__dirname, 'public'))); //靜態(tài)資源目錄的中間件
7.4.第三方中間件
通過使用第三方中間件從而為 Express 應(yīng)用增加更多功能。
安裝所需功能的 node 模塊,并在應(yīng)用中加載,可以在應(yīng)用級加載,也可以在路由級加載。
Multer 翻譯文檔https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md
文件上傳中間件的使用
fileUpload.html 靜態(tài)頁面
<form action="/upload" method="post" enctype="multipart/form-data">
<h2>圖片上傳</h2>
<input type="file" name="imgUpload">
<input type="submit" value="上傳">
</form>
index.js 路由
/*
- npm i multer --save
前端準(zhǔn)備工作:
1、需要一個表單,表單里面必須有一個文件域
2、必須給form表單指定enctype="multipart/form-data" 屬性。
3、提交按鈕類型為submit。
后端:接收請求
1:前端請求表單頁面http://127.0.0.1/upload/
2:渲染模板,不需加載額外的數(shù)據(jù)。
教程:
http://blog.csdn.net/CatieCarter/article/details/77841208
https://github.com/expressjs/multer
*/
//引入文件模塊
var fs = require("fs");
//引入上傳中間件模塊
var multer = require('multer');
//初始化上傳目錄,自定義本地保存的路徑
//var upload = multer({ dest: './files/' }); //使用storage時不需要單獨(dú)制定目錄,storage中有目錄設(shè)置
var uploadFolder='./public/files/'; //放入靜態(tài)資源目錄才能正常顯示
// 通過storage的 filename 屬性定制上傳文件名稱
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, uploadFolder); // 保存的路徑,備注:需要自己創(chuàng)建如果不存在會報錯
},
filename: function (req, file, cb) {
//將保存文件名設(shè)置為 前綴+時間戳+文件擴(kuò)展名
var extName=file.originalname.substring(file.originalname.lastIndexOf(".")); //.jpg
cb(null, file.fieldname + '_' + new Date().getTime() + extName);
}
});
// 通過 storage 選項來對 上傳行為 進(jìn)行定制化
var upload = multer({ storage: storage });
//文件上傳的路由,upload.single("imgUpload")指定單個文件上傳,上傳框的名稱為imgUpload
router.post('/upload',upload.single("imgUpload"), function(req, res, next) {
var fileInfo = req.file; //multer會將文件的信息寫到 req.file上
console.log('文件類型:', fileInfo.mimetype);
console.log('原始文件名:', fileInfo.originalname);
console.log('文件大?。?, fileInfo.size);
console.log('文件保存路徑:', fileInfo.path);
//渲染圖片顯示的模板,直接獲取文件存放的地址,顯示時不需要public目錄
var filepath=fileInfo.path.toString().replace("public","");
res.render("imgFileList.ejs",{imgShow: filepath});
//直接顯示出來
res.set({"Content-Type":"text/html"});
res.send("<img src='"+fileInfo.path.toString().replace("public","")+"' />");
});
imgFileList.ejs 圖片顯示模板
<body>
<h1>圖片上傳展示</h1>
<p><img src="<%= imgShow%>" /></p>
</body>
| Key | Description |
|---|---|
| fieldname | Field name 由表單指定 |
| originalname | 用戶計算機(jī)上的文件的名稱 |
| encoding | 文件編碼 |
| mimetype | 文件的 MIME 類型 |
| size | 文件大小(字節(jié)單位) |
| destination | 保存路徑 |
| filename | 保存在 destination 中的文件名 |
| path | 已上傳文件的完整路徑 |
| buffer | 一個存放了整個文件的 Buffer |
8.課程總結(jié)
8.1.重點(diǎn)
1.安裝 express
2.express的路由編寫
3.請求對象
4.響應(yīng)對象
8.2.難點(diǎn)
1.路由編寫
2.中間件
8.3.如何掌握?
1.此技能通過使用升級。
2.將常見的用法截圖保存到文件夾中,時常回顧。
8.4.排錯技巧(技巧)
1.console.log()方法。
9.作業(yè)
作業(yè)難度: ☆☆☆
1、在自己的電腦上安裝exress框架
2、如何獲取GET和POST方式傳值,分別使用什么方法。
3、編寫路由實(shí)現(xiàn)一個簡易的企業(yè)網(wǎng)站基本結(jié)構(gòu),根據(jù)不同鏈接路徑響應(yīng)不同的內(nèi)容。
首頁 | 新聞中心 | 產(chǎn)品展示 | 客戶留言 | 關(guān)于我們 | 聯(lián)系我們 | 官方商城
10.面試題
1.網(wǎng)絡(luò)服務(wù)器的工作原理
11.擴(kuò)展知識或課外閱讀推薦(可選)
11.1.擴(kuò)展知識
使用 express-generator 創(chuàng)建的基本框架中各個目錄的作用,以及靜態(tài)目錄
【補(bǔ)充】 cookie
由于HTTP是無狀態(tài)協(xié)議,無法識別兩次請求之間的關(guān)系,為了識別用戶身份使用cookie技術(shù)。cookie技術(shù)是一向由服務(wù)器端設(shè)置數(shù)據(jù),存儲在客戶端瀏覽器緩存中的一項技術(shù)。
只要服務(wù)器向瀏覽器設(shè)置了cookie,每一次瀏覽器發(fā)起請求時,都會自動攜帶這些cookie數(shù)據(jù)去訪問服務(wù)器。服務(wù)器可以接收到數(shù)據(jù)并識別用戶身份。
//設(shè)置新的cookie
res.cookie('名稱','值');
//修改cookie
res.cookie('名稱','新的值');
//刪除cookie
res.clearCookie('名稱');
//獲取查詢使用cookie
req.cookies.名稱;
npm i --save nodemon
nodemon appname