簡介
Node.js® is a JavaScript runtime built on Chrome’s V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js’ package ecosystem, npm, is the largest ecosystem of open source libraries in the world.
試用場景
- 適宜I/O密集型運用
- 適宜前端開闢者疾速搭建服務器,平經常使用於前後端星散
裝置Nodejs
windows
- 翻開node官網(https://nodejs.org)
- 直接點擊
LTS
版本,下載裝置包,Current
版本是開闢版,不要下載,如圖 - 下載完成以後,直接裝置即可
ubuntu
運轉以下敕令
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - sudo apt-get install -y nodejs
mac
- 與windows相似,下載裝置包即可
- 與windows相似,下載裝置包即可
裝置完成后,運轉以下敕令搜檢是不是裝置勝利,(以上要領裝置node都邑帶上對應的npm,所以也須要搜檢一下npm是不是裝置勝利。)
node -v // 搜檢node版本
npm -v // 搜檢npm版本
搭建服務器
- 裝置express
Express is a minimal and flexible Node.js web application framework that provides a robust set of features for web and mobile applications.
npm install express -g // 全局裝置express
npm install express-generator -g // 全局裝置express腳手架,裝置以後能夠運用express敕令
express --version // 搜檢express版本
- 天生項目文件
mkdir app
cd app
/**
* 天生項目文件
* express 默許運用ajs模板,加上 -e 指定更友愛的ejs模板
*/
express -e
npm intall // 裝置依靠
npm start // 啟動項目
然後瀏覽器接見localhost:3000
,最簡樸的服務器就ok了。
Express 進階
怎樣修正順序啟動的默許
3000
端口
Express 的啟動目次是<project>/bin/www
,內里有一行代碼:var port = normalizePort(process.env.PORT || '3000');
不難看出順序先去取
process.env.PORT
(環境變量PORT)的值,沒有就默許為3000
所以假如想轉變端口,能夠直接把3000
改成想要的端口號或許修正環境變量PORT的值,操縱以下:
在啟動順序之前,實行// ubuntu IOS export PORT=4000; // windows set PORT=4000;
然後實行
npm start
,端口就被設置成了4000.怎樣修正運轉環境
Express默許的運轉環境是development
,運轉環境能夠經由過程process.env.NODE_ENV
來獵取,將體系環境設置為production
,代碼以下:// ubuntu IOS export NODE_ENV=production // wondows set NODE_ENV=production
怎樣增加接口
在app.js
中,app.use('/', routes);
前面新增app.get('/status', function (req, res) { res.send({status: 'ok'}); })
啟動服務器,接見
localhost:3000/status
,獲得數據{status: 'ok'}
;
具體分析一下:app.get()
,get
是app對象的一個要領,負責處置懲罰get要領,改成post
,則只處置懲罰post
要求,不會處置懲罰別的要求,其他像put
,delete
相似。若寫成use
,則會處置懲罰此路由任何要領的要求。/status
, 指定須要處置懲罰的路由
回調函數,即要求此路由的處置懲罰函數,它能夠吸收兩個參數,三個參數,四個參數。一旦參數為四個就被express認定是毛病處置懲罰函數// app.js 里這就是個毛病處置懲罰函數,用來處置懲罰一切路由上面拋出的毛病,平常寫在末了 app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: err }); });
req
Express 封裝的http request對象,包括headers
,query
,params
等自帶屬性。用來獵取某次http要求的各項數據。
res
Express 封裝的http reponse對象,包括send
,json
,jsonp
等要領。
next
假如實行next
,在實行完此處置懲罰函數以後,會繼承向後找下一個處置懲罰函數,app.get('/test-next', function(req, res, next) { console.log('first handler fn'); next(); }); app.get('/test-next', function(req, res, next) { res.send({status: 'second handler fn'}); });
瀏覽器接見
localhoat:3000/test-next
,會獲得{status: 'second handler fn'}
,
處置懲罰路由/test-next
,第一個回調函數,實行到next()
時,繼承找下一個能處置懲罰/test-next
的回調.什麼是中心件
中心件(middlewear)是Express中的一個主要觀點,Express運用中心件完成對要求體的革新,或許實行一些中心操縱。歸根結柢,中心件就是一個函數,滿足兩個前提,- 有
req
,res
,next
三個參數, 末了實行
next
函數,將處置懲罰權移交出去寫一個打印要求的中心件:
// 定義中心件,打印要求的要領和url function logRequest(req, res, next) { console.log(req.method, method.url); next(); } // 運用中心件 app.use(logRequest);
- 有
Express 怎樣處置懲罰路由
關於一個要求,Express處置懲罰經由一下流程- 從第一個use最先處置懲罰要求,假如是中心件,處置懲罰完成以後,繼承向下處置懲罰
- 假如碰到指定靜態文件的中心件,會查詢靜態文件是不是婚配,假如婚配直接返回,不婚配就繼承向下尋覓適宜路由。
- 假如婚配到自定義的路由,馬上實行回調函數,假如處置懲罰函數中沒有
next()
則不再往下實行,假如實行了next()
,會繼承向下婚配。 - 假如一個也沒有婚配到,會進入
404
處置懲罰中心件,這个中心件會拋出一個毛病,交由毛病處置懲罰中心件處置懲罰。
明白靜態資本處置懲罰中心件
app.use(express.static(path.join(__dirname, 'public')));
,express.static(PATH)
會將指定的目次下的一切資本作為靜態資本。客戶端能夠輸入指定資本的途徑接見此資本。實在能夠明白為將靜態資本的途徑,作為路由註冊到了app
上。
假如要將文件<project>/public/stylesheets/style.css
,設置為靜態資本,能夠指定靜態文件目次app.use(express.static(path.join(__dirname, 'public')));
也能夠不設置靜態文件,自定義路由
app.get('/stylesheets/style.css', function (req, res, next) { res.sendFile(path.join(__dirname, 'public/stylesheets/style.css')); })
兩種體式格局接見
http://localhost:3000/stylesheets/style.css
都能獲得style.css
文件。
靜態資本和用戶自定義路由是等價的,所以,平常將靜態資本處置懲罰中心件放在用戶自定義中心件前面,防止路由爭執。怎樣運用模板(默許運用ejs模板引擎)
// path 為.ejs模板的途徑 // data 是給模板傳入的值,必需是對象範例 res.render(<path>, [data]);
比方
app.jsapp.get('/ejs', function(req, res, next) { res.render('index', { title: 'Express' }); });
index.ejs
<h1><%= title %></h1> <p>test ejs</p>
接見
localhost:3000/ejs
即可看到效果。
ejs的經常使用語法以下<% %> 在標籤里能夠寫恣意的 javascript 代碼,能夠把 javascript 代碼拆開或許合在一同寫,也能夠與 html 標籤一同寫:
<% var a = 1 var b = 2 var c = a+b %> // var user = [1,2,3] <% for(let i=0; i<user.length; i++) { %> <p> html </p> <% } %>
<%= %> 輸出轉義后的內容
// ejs <p><%= '<lol>' %></p> // 轉義后 <p><lol></p>
<%- %> 輸出未轉義的內容
// ejs <p><%- '<a href="http://www.baidu.com>baidu</a>' %></p> // 不轉義的輸出 <p><a href="http://www.baidu.com>baidu</a></p>
- <%# %> 解釋
include 引入其他 ejs 文件,比方援用當前 ejs 文件同級目次下有一個名為 test.ejs 的文件,代碼以下:
// exp1 <% var data = 1 %> <% include ./test %> // exp2 <%- include('test', {data:1}) %>