原始鏈接:https://segmentfault.com/a/1190000010190604#articleHeader22
1.Express簡(jiǎn)介
Express是基于Node.js平臺(tái)、快速、開(kāi)放、極簡(jiǎn)的web開(kāi)發(fā)框架,它提供了一系列強(qiáng)大的特性,幫助你創(chuàng)建各種web和移動(dòng)設(shè)備應(yīng)用。
Express不對(duì)Node.js已有特性進(jìn)行二次抽象,我們只是在它之上擴(kuò)展了web應(yīng)用所需的基本功能。
注意:Express是一個(gè)自身功能極簡(jiǎn),完全是由路由和中間件構(gòu)成的一個(gè)web開(kāi)發(fā)框架:從本質(zhì)上來(lái)說(shuō),一個(gè)Express應(yīng)用就是在調(diào)用各種中間件。
API方面:豐富的HTTP快捷方法和任意排列組合的Connect中間件,讓你創(chuàng)建健壯、友好的API變得既快速又簡(jiǎn)單。
特性:
- Robust routing
- Focus on high performance
- Super-high test coverage
- HTTP helpers(redirection, caching, etc)
- View system supporting 14+ template engines
- Content negotiation
- Executable for generating applications quickly
安裝和hello world
--save:安裝模塊時(shí),如果制定了--save參數(shù),那么此模塊將被添加到package.json文件中的dependencies依賴列表中,然后通過(guò)npm install命令即可自動(dòng)安裝依賴列表中所列出的所有模塊。如果只是臨時(shí)安裝,不想把它添加到依賴列表中,只要省略--save參數(shù)就可以。
tips:項(xiàng)目文件夾的名字和所要安裝的項(xiàng)目依賴不能重名。(例如創(chuàng)建了一個(gè)名為express的項(xiàng)目文件及,如果初始化后,安裝express。會(huì)報(bào)錯(cuò):Refusing to install express as a dependency of itself。)
# 工作目錄
$ mkdir myapp
$ cd myapp
# 通過(guò)npm init命令為你的應(yīng)用創(chuàng)建一個(gè)package.json文件
$ npm init
# 應(yīng)用的入口文件
entry point: app.js
# 安裝Express并將其保存在依賴列表中
$ npm install express --save
下面的代碼啟動(dòng)一個(gè)服務(wù)并監(jiān)聽(tīng)從3000端口進(jìn)入的所有連接請(qǐng)求。他將對(duì)所有(/)URL或路由返回hello world字符串。對(duì)于其他所有路徑返回404 Not Found。
req(request,請(qǐng)求)和res(response, 響應(yīng))與Node提供的對(duì)象完全一致,因此,你可以調(diào)用req.pipe(),req.on('data', callback)以及任何Node提供的方法。
const express = require('express');
let app = express();
app.get('/', function(req, res) {
res.send('hello world');
});
let server = app.listen(3000, function() {
let host = server.address().address;
let port = server.address().port;
console.log(`app listening at port: ${port}`);
});
# 啟動(dòng)此應(yīng)用
$ node app.js
http://localhost:3000/
Express應(yīng)用生成器
通過(guò)應(yīng)用生成器,express可以快速創(chuàng)建一個(gè)應(yīng)用的骨架。
通過(guò)Express應(yīng)用生成器創(chuàng)建應(yīng)用只是眾多方法中的一種,你可以根據(jù)自己的需求修改它。
# 安裝
$ npm install express-generator -g
# 列出所有可用命令
$ express -h
# 初始化一個(gè)express項(xiàng)目
$ express myapp
$ cd myapp
# 然后安裝所有依賴包
$ npm install
# 啟動(dòng)此應(yīng)用
$ npm start
http://localhost:3000/
2.路由(Routing)
路由是指如何定義應(yīng)用的端點(diǎn)(URIs)以及如何響應(yīng)客戶端的請(qǐng)求。
路由(Routing)是由URI(路徑)和一個(gè)特定的HTTP方法(get、post、put、delete等)組成的,涉及到應(yīng)用如何響應(yīng)客戶端對(duì)某個(gè)網(wǎng)站節(jié)點(diǎn)的訪問(wèn)。
結(jié)構(gòu)
路由的定義由以下結(jié)構(gòu)組成:
- app是一個(gè)express實(shí)例
- method是某個(gè)HTTP請(qǐng)求方式中的一個(gè),Express定義了如下和HTTP請(qǐng)求對(duì)應(yīng)的路由方法:get, post, put, head, delete, options, tracem copy, lock, mkcol, move, purge, propfind, proppatch, unlock, report, mkactivity, checkout, merge, m-search, notify, subscirbe, unsubscirbe, patch, search, connect。有一些路由方法名并不是符合規(guī)范的javaScript變量名,此時(shí)用括號(hào)記法,比如:app['m-search'('/', function ...)
- path是服務(wù)端的路徑
- handler每一個(gè)路由都可以有一個(gè)或者多個(gè)處理器函數(shù),當(dāng)匹配到路由時(shí),這些函數(shù)將被執(zhí)行。
app.method(path, [handler...], handler)
// respond with"hello world" when a GET request is made to the homepage
app.get('/', function(req, res) {
res.send('hello World!');
});
app.all()是一個(gè)特殊的路由方法,沒(méi)有任何HTTP方法與其對(duì)應(yīng),它的作用是對(duì)于一個(gè)路徑上所有請(qǐng)求加載中間件。在下面的例子中,來(lái)自/secret的請(qǐng)求,不管使用GET、POST或者其他任何HTTP請(qǐng)求,句柄都會(huì)得到執(zhí)行。
app.all('/secret', function(req, res, next) {
res.send('GET request to the secret section');
console.log('Accessing the secret section ...');
next(); // pass control to the next handler
});
路由路徑path
路由路徑和請(qǐng)求方法一起定義了請(qǐng)求的端點(diǎn),它可以是字符串,字符串模式或者正則表達(dá)式。
使用字符串的路由路徑示例:
// 匹配根路徑的請(qǐng)求
app.get('/', function(req, res) {
res.send('root');
});
// 匹配/about路徑的請(qǐng)求
app.get('/about', function(req, res) {
res.send('about');
});
// 匹配/random.text路徑的請(qǐng)求
app.get('/random.text', function(req, res) {
res.send('random.text');
});
使用字符串模式的路由路徑示例:
// 匹配 acd 和 abcd
app.get('/ab?cd', function(req, res) {
res.send('ab?cd');
});
// 匹配 /abe 和 /abcde
app.get('/ab(cd)?e', function(req, res) {
res.send('ab(cd)?e');
});
// 匹配 abcd、abbcd、abbbcd等
app.get('/ab+cd', function(req, res) {
res.send('ab+cd');
});
// 匹配 abcd、abxcd、abRABDOMcd、ab123cd等
app.get('/ab*cd', function(req, res) {
res.send('ab*cd');
});
使用正則表達(dá)式的路由路徑示例:
// 匹配任何路徑中含有a的路徑:
app.get(/a/, function(req, res) {
res.send('/a/');
});
// 匹配butterfly、dragonfly,不匹配bufferflyman、dragonfly man等
app.get(/.*fly$/, function(req, res) {
res.send('/.*fly$/');
});
路由句柄handler
注意:Can't set headlers after they are sent
可以為請(qǐng)求提供多個(gè)回調(diào)函數(shù),其行為類似于中間件。唯一的區(qū)別是這些回調(diào)函數(shù)有可能調(diào)用next('route')方法而略過(guò)其他路由回調(diào)函數(shù),可以利用該機(jī)制為路由定義前提條件,如果在現(xiàn)有路徑上繼續(xù)執(zhí)行沒(méi)有意義,則可以將控制權(quán)交給剩下的路徑、
路由句柄有多種形式,可以是一個(gè)函數(shù),一個(gè)函數(shù)數(shù)組,或者兩者混合,如下所示:
使用一個(gè)回調(diào)函數(shù)處理路由:
app.get('/example/a', function(req, res) {
res.send('Hello from A!');
});
使用多個(gè)回調(diào)函數(shù)處理路由(記得指定該next對(duì)象):
app.get('/example/b', function(req, res, next) {
console.log('response will be sent by the next function ...');
next();
}, function(req, res) {
res.send('Hello from B!');
});
使用回調(diào)函數(shù)數(shù)組處理路由:
var cb0 = function(req, res, next) {
console.log('CB0');
next();
}
var cb1 = function(req, res, next) {
console.log('CB1');
next();
}
var cb2 = function(req, res) {
res.send('Hello from C!');
}
app.get('example/c', [cb0, cb1, cb2]);
混合函數(shù)和函數(shù)數(shù)組處理路由:
var cb0 = function(req, res, next) {
console.log('CB0');
next();
}
var cb1 = function(req, res, next) {
console.log('CB1');
next();
}
app.get('/example/d', [cb0, cb1], function(req, res, next) {
console.log('reponse will be sent by the next function...');
next();
}, function() {
res.send('Hello from D!');
});
響應(yīng)方法 res
下表響應(yīng)對(duì)象(res)的方法向客戶端返回響應(yīng),終結(jié)請(qǐng)求相應(yīng)的循環(huán)。如果在路由句柄中一個(gè)方法也不調(diào)用,來(lái)自客戶端的請(qǐng)求會(huì)一直掛起。
res.down() 提示下載文件
res.end() 終結(jié)響應(yīng)處理流程
res.json() 發(fā)送一個(gè)JSON格式的響應(yīng)
res.jsonp() 發(fā)送一個(gè)支持JSONP的JSON格式響應(yīng)
res.redirect() 重定向請(qǐng)求
res.render() 渲染視圖模板
res.send() 發(fā)送各種類型的響應(yīng)
res.sendFile() 以八位字節(jié)流的形式發(fā)送文件
res.sentStatus() 設(shè)置響應(yīng)狀態(tài)代碼,并將其以字符串形式作為響應(yīng)體的一部分發(fā)送。
app.route()
可使用app.route()創(chuàng)建路由路徑的鏈?zhǔn)铰酚删浔?。由于路徑在一個(gè)地方制定,這樣做有助于創(chuàng)建模塊化的路由,且減少了代碼冗余和拼寫錯(cuò)誤。
app.route('/book')
.get(function(req, res) {
res.send('Get a random book');
})
.post(function(req, res) {
res.send('Add a book');
})
.put(function(req, res) {
res.send('Update the book');
});
express.Router
可使用express.Router類創(chuàng)建模塊化,可掛載的路由句柄。
下面的實(shí)例程序創(chuàng)建了一個(gè)路由模塊,并加載了一個(gè)中間件,定義了一些路由,并且將它們掛載在至應(yīng)用的路徑上,在app目錄下創(chuàng)建名為bird.js的文件,內(nèi)容如下:
var express = require('express');
var router = express.Router();
// 該路由使用的中間件
router.use(function timeLog(req, res, next) {
console.log('Time: ', Date.now());
next();
});
// 定義網(wǎng)站主頁(yè)的路由
router.get('/', function(req, res) {
res.send('Birds home page');
});
// 定義about頁(yè)面的路由
router.get('/about', function(req, res) {
res.send('About Birds');
});
module.exports = router;
然后在應(yīng)用中加載路由模塊,應(yīng)用即可處理發(fā)自/birds和birds/about的請(qǐng)求,并且調(diào)用為路由制定的timeLog中間件。
var birds = require('./birds');
...
app.use('/birds', birds);
3.中間件(Middleware)
Express是一個(gè)子很功能極簡(jiǎn),完全是路由和中間件構(gòu)成的一個(gè)web開(kāi)發(fā)框架:從本質(zhì)上來(lái)說(shuō),一個(gè)Express應(yīng)用就是在調(diào)用各種中間件。
中間件(Middleware)是一個(gè)函數(shù),它可以訪問(wèn)請(qǐng)求對(duì)象(req),響應(yīng)對(duì)象(res),和web應(yīng)用中處于請(qǐng)求-響應(yīng)循環(huán)流程中的中間件,一般命名為next的變量。
中間件的功能包括:
- 執(zhí)行任何代碼。
- 修改請(qǐng)求和響應(yīng)對(duì)象。
- 終結(jié)請(qǐng)求-響應(yīng)循環(huán)。
- 調(diào)用堆棧中的下一個(gè)中間件。
注意:如果當(dāng)前中間件沒(méi)有終結(jié)請(qǐng)求-響應(yīng)循環(huán),則必須調(diào)用next()方法將控制器交給下一個(gè)中間件,否則請(qǐng)求就會(huì)掛起。
app.use
app.use([path], function)
Use the given middleware function, with optional mount path, defaulting to "/".
一個(gè)中間件處理器,請(qǐng)求來(lái)了,讓那些中間件先處理一遍
- 沒(méi)有掛載路徑的中間件,應(yīng)用的每個(gè)請(qǐng)求都會(huì)執(zhí)行該中間件。
- 掛在至/path的中間件,任何指向/path的請(qǐng)求都會(huì)執(zhí)行它。
中間件分類
Express應(yīng)用可使用如下幾種中間件:
- 應(yīng)用級(jí)中間件
- 路由級(jí)中間件
- 錯(cuò)誤處理中間件
- 內(nèi)置中間件
- 第三方中間件
1.應(yīng)用級(jí)中間件
應(yīng)用級(jí)中間件綁定到app對(duì)象使用app.use()和app.METHOD(),其中:METHOD是需要處理的HTTP請(qǐng)求的方法,例如:GET,PUT,POST等等,全部小寫。例如:
var app = express();
// 沒(méi)有掛載路徑的中間件,應(yīng)用的每個(gè)請(qǐng)求都會(huì)執(zhí)行該中間件
app.use(function(req, res, next) {
console.log('Time: ', Date.now());
next();
});
// 掛載至/user/:id的中間件,任何指向/user/:id的請(qǐng)求都會(huì)執(zhí)行它
app.use('/user/:id', function(req, res, next) {
console.log('Request Type:', req.method);
next();
});
// 路由和句柄函數(shù)(中間件系統(tǒng)),處理指向/user/:id的GET請(qǐng)求
app.get('/user/:id'. function(req, res, next) {
res.send('USER');
});
// 一個(gè)中間件棧,對(duì)任何指向/user/:id的HTTP請(qǐng)求打印出相關(guān)信息
app.use('/user/:id', function(req, res, next) {
console.log('Request URL:', req.originalUrl);
next();
}, function(req, res, next) {
console.log('Request Type:', req.method);
next();
});
2.路由級(jí)中間件
路由級(jí)中間件和應(yīng)用級(jí)中間件一樣,只是它綁定的對(duì)象為express.Router()。路由級(jí)使用router.use()或router.VERB()加載。
上述應(yīng)用級(jí)中間件系統(tǒng),可以通過(guò)如下代碼寫為路由級(jí):
var app = express();
var router = express.Router();
// 沒(méi)有掛載路徑的中間件,通過(guò)該路由的每個(gè)請(qǐng)求都會(huì)執(zhí)行該中間件
router.use(function(req, res, next) {
console.log('Time:', Date.now());
next();
});
// 一個(gè)中間件棧,顯示任何指向/user/:id的HTTP請(qǐng)求信息
router.use('/user/:id', function(req, res, next) {
console.log('Request URL:', req.originUrl);
next();
}, function(req, res, next) {
console.log('Request Type:', req.method);
next();
});
// 一個(gè)中間件棧,處理指向/user/:id的GET請(qǐng)求
router.get('/user/:id', function(req, res, next) {
// 如果user id為0,跳到下一個(gè)路由
if(req.params.id == 0) next('route');
// 負(fù)責(zé)將控制權(quán)交給棧中下一個(gè)中間件
else next();
}, function(req, res, next) {
// 渲染常規(guī)頁(yè)面
res.render('regular');
});
// 處理/user/:id,渲染一個(gè)特殊頁(yè)面
router.get('/user/:id', function(req, res, next) {
console.log(req.params.id);
res.render('special');
});
// 將路由掛載至應(yīng)用
app.use('/', router);
3.錯(cuò)誤處理中間件
錯(cuò)誤處理中間件與其他中間件定義類似,只是必須使用4個(gè)參數(shù)(err, req, res, next),即時(shí)不需要next對(duì)象,也必須在簽名中聲明它,否則中間件將會(huì)被識(shí)別為一個(gè)常規(guī)中間件,不能處理錯(cuò)誤。
錯(cuò)誤處理中間件應(yīng)當(dāng)在其他app.use()和路由調(diào)用之后才能加載,比如:
var bodyParser = require('body-Parser');
var methodOverride = require('method-override');
app.use(bodyParser());
app.use(methodOverride());
app.use(function(err, req, res, next) {
// 業(yè)務(wù)邏輯
console.error(err.stack);
res.status(500).send('Something broke!');
});
中間件返回的響應(yīng)是隨意的,可以響應(yīng)一個(gè)HTML錯(cuò)誤頁(yè)面,依據(jù)簡(jiǎn)單的話,一個(gè)JSON字符串,或者其他任何您想要的東西。
為了便于組織(更高級(jí)的框架),您可能會(huì)像定義常規(guī)中間件一樣,定義多個(gè)錯(cuò)誤處理中間件,比如您想為使用XHR的請(qǐng)求定義一個(gè),還想為沒(méi)有使用的定義一個(gè),那么:
var bodyParser = require('body-parser');
var methodOverride = require('method-override');
app.use(bodyParser());
app.use(methodOverride());
app.use(logErrors);
app.use(clientErrorHandler);
app.use(errorHandler);
// logErrors將請(qǐng)求和錯(cuò)誤信息寫入標(biāo)準(zhǔn)錯(cuò)誤輸出、日志或類似服務(wù):
function logErrors(err, req, res, next) {
console.log(err.stack);
next(err);
}
// clientErrorHandler的定義如下(注意這里將錯(cuò)誤直接傳給了next)
function clientErrorHandler(err, req, res, next) {
if(req.xhr) {
res.status(500).send({ error: 'Something blew up!'});
} else {
next(err);
}
}
// errorHandler能捕獲所有錯(cuò)誤,其定義如下:
function errorHandler(err, req, res, next) {
res.status(500);
res.render('error', {error: err});
}
4.內(nèi)置中間件
Express以前內(nèi)置的中間件現(xiàn)在已經(jīng)全部單獨(dú)作為模塊安裝使用了。
express.static是Express唯一內(nèi)置的中間件,它基于serve-static,負(fù)責(zé)在Express應(yīng)用中提供托管靜態(tài)資源的服務(wù)。
5.第三方中間件
下面的例子安裝并加載了一個(gè)解析cookie的中間件:cookie-parser
$ npm install cookie-parser
var express = require('express');
var app = express();
var cookieParser = require('cookie-parser');
// 加載用于解析cookie的中間件
app.use(cookieParser());
4.托管靜態(tài)文件
通過(guò)Express內(nèi)置的express.static可以方便的托管靜態(tài)文件,例如:圖片、CSS、JavaScript文件等。將靜態(tài)資源文件所在的目錄作為參數(shù)傳遞給express.static,中間件就可以提供靜態(tài)資源文件的訪問(wèn)了。
使用
所有文件的路徑都是相對(duì)于存放目錄的,因此,存放靜態(tài)文件的目錄名不會(huì)出現(xiàn)在URL中。
假設(shè)在public目錄放置了圖片、CSS和JavaScript文件,你就可以:
app.use(express,static('public'));
現(xiàn)在,public目錄下的文件就可以訪問(wèn)了。
- http://localhost:3000/images/...
- http://localhost:3000/css/style.css
- http://localhost:3000/js/app.js
-
http://localhost:3000/hello.html
如果你的靜態(tài)資源放在多個(gè)目錄下面,你可以多次調(diào)用express.static中間件。
訪問(wèn)靜態(tài)資源文件時(shí),express,static中間件會(huì)根據(jù)目錄添加的順序查找所需的文件。
app.use(express.static('public'));
app.use(express.static('files'));
如果你希望通過(guò)express.static訪問(wèn)的文件都存放在一個(gè)虛擬目錄中(即目錄根本不存在),可以通過(guò)為靜態(tài)資源目錄指定一個(gè)掛載路徑的方式來(lái)實(shí)現(xiàn),如下所示:
app.use('/static', express.static('public'));
現(xiàn)在,你就可以通過(guò)帶有/static前綴的地址來(lái)訪問(wèn)public目錄下面的文件了。
- http://localhost:3000/static/images/kitten.jpg
- http://localhost:3000/static/css/style.css
- http://localhost:3000/static/js/app.js
- http://localhost:3000/static/images/bg.png
- http://localhost:3000/static/hello.html
path.join()
注意:Arguments to the path join must be strings
將多個(gè)參數(shù)組合成一個(gè)path,語(yǔ)法:
path.join([path1], [path2], [...]);
由于該方法屬于path模塊,使用前需要引入path模塊
const express = require('express');
const path = require('path');
var app = express();
app.set('views', path.join(__dirname, 'views'));
app.use(express.static(path.join(__dirname. 'public')));
5.Express中使用模板引擎
安裝相應(yīng)的模板引擎npm軟件包,不需要在頁(yè)面require('pug');
$ npm install pug --save
編寫模板文件
html
head
title != title
body
h1 != message
然后創(chuàng)建一個(gè)路由,來(lái)渲染模板文件,模板文件會(huì)被渲染為HTML。如果沒(méi)有設(shè)置view enginine,您需要指明視圖文件的后綴,否則就會(huì)遺漏它。
- views 存放模板文件的目錄
- view.engine 注冊(cè)模板引擎
const express = require('express');
let app = express();
// view engine setup
app,set('views', ['./v']);
app,set('view engine', 'pug');
// http://localhost:3000/index
app.get('/index', function(req, res) {
res.render('index', {
title: 'Hey',
message: 'view engine, Hello there!'
});
});
// 首頁(yè)路由
app.get('/', function(req, res) {
res.send('index routing, hello world');
});
let server = app.listen(3000, function() {
let host = server.address().address;
let port = server.address().port;
console.log(`app listening at port: ${port}`);
});
6.Express 4遷移
Express 4是對(duì)Express 3的一個(gè)顛覆性改變,也就是說(shuō)如果您更新了Express,Express 3應(yīng)用會(huì)無(wú)法工作。
1.對(duì)Express內(nèi)核和中間件系統(tǒng)的改進(jìn)
| Express 3 | Express 4 |
|---|---|
| express.bodyParser | body-parser + multer |
| express.comress | compression |
| express.cookieSession | cookie.session |
| express.cookieParser | cookie.parser |
| express.logger | morgan |
| express.session | express-session |
| express.favicon | serve-favicon |
| express.responseTime | reponse-time |
| express.errorHandler | errorhandler |
| express.methodOverride | method-override |
| express.timeout | connect-timeout |
| express.vhost | vhost |
| express.csrf | csurf |
| express.directory | serve-index |
| express.static | serve-static |
Express 4不再依賴Connect,而且從內(nèi)核中移除了除express.static外的所有內(nèi)置中間件。
也就是說(shuō)現(xiàn)在的Express是一個(gè)獨(dú)立的路由和中間件Web框架,Express的版本升級(jí)不再受中間件更新的影響。
移除了內(nèi)置的中間件后,您必須顯式地添加所有運(yùn)行應(yīng)用需要的中間件,請(qǐng)遵循如下步驟:
1.安裝模塊:
2.在應(yīng)用中引入模塊:
3.按照文檔的描述使用模塊:
下表列出了Express 3和Express 4對(duì)應(yīng)的中間件:
| Express 3 | Express 4 |
|---|---|
| express.bodyParser | body-parser + multer |
| express.comress | compression |
| express.cookieSession | cookie.session |
| express.cookieParser | cookie.parser |
| express.logger | morgan |
| express.session | express-session |
| express.favicon | serve-favicon |
| express.responseTime | reponse-time |
| express.errorHandler | errorhandler |
| express.methodOverride | method-override |
| express.timeout | connect-timeout |
| express.vhost | vhost |
| express.csrf | csurf |
| express.directory | serve-index |
| express.static | serve-static |
2.路由系統(tǒng)
應(yīng)用現(xiàn)在隱式加載路由中間件,因此不需要擔(dān)心涉及到router中間件對(duì)路由中間件加載順序的問(wèn)題了。
定義路由的方式依然未變,但是新的路由系統(tǒng)有兩個(gè)新功能幫助您組織路由:
- 添加了一個(gè)新類:express.Router,可以創(chuàng)建可掛載的模塊化路由句柄。
+添加了一個(gè)新方法:app.route(),可以為路由路徑創(chuàng)建鏈?zhǔn)铰酚删浔?/li>
3.其他變化
| 對(duì)象 | 描述 |
|---|---|
| Node | >Express 4需要Node 0.10.x或以上版本,已經(jīng)放棄了對(duì)Node 0.8.x的支持。 |
| http.createServer() | http模塊不再是必須的了,除非您需要直接使用它(socket.io/SPDY/HTTPS),現(xiàn)在可以使用app.listen()啟動(dòng)應(yīng)用了。 |
| app.configure() | 已經(jīng)刪除app.configure(),使用process.env.NODE_ENV或者app.get('env')檢測(cè)環(huán)境并配置應(yīng)用 |
| json spaces | Expresss 4默認(rèn)禁用 json spaces屬性 |
| req.accepted() | 使用req.accepts(),req.acceptsEncoding(), req.acceptsCharsets()和req.acceptsLanguages() |
| res.location() | 不再解析相對(duì)URLs |
| res.params | 此函數(shù)變?yōu)閷?duì)象 |
| res.locals | 此函數(shù)變?yōu)閷?duì)象 |
| res.headerSent | 變?yōu)閞es.headersSent |
| app.route() | 變?yōu)閍pp.mountpath |
| res.on('header') | 已刪除 |
| res.charset | 已刪除 |
| res.setHeader('Set-Cookie', val) | F功能僅限于設(shè)置基本的cookie值,使用res.cookie()訪問(wèn)更多功能。 |
運(yùn)行:
node .
遷移
卸載Express 3 應(yīng)用生成器:
$ npm uninstall -g express
然后安裝新的生成器:
$ npm install -g express-generator