nodejs中express入門(mén)和基礎(chǔ)知識(shí)點(diǎn)學(xué)習(xí)
初始化
新建一個(gè)目錄myapp,項(xiàng)目初始化
$ npm init
安裝express
$ npm install express --save
創(chuàng)建一個(gè)hello world實(shí)例
進(jìn)入myapp目錄,創(chuàng)建一個(gè)名為app.js
var express = require('express');
var app = express();
app.get('/', function(req, res) {
res.send('Hello World!');
});
var server = app.listen(3000, function() {
var host = server.address().address;
var port = server.address().port;
console.log('Example app listening at http://%s:%s', host, port);
});
上面的代碼啟動(dòng)一個(gè)服務(wù)并監(jiān)聽(tīng)從 3000 端口進(jìn)入的所有連接請(qǐng)求。他將對(duì)所有 (/) URL 或 路由 返回 “Hello World!” 字符串。對(duì)于其他所有路徑全部返回 404 Not Found。
通過(guò)以下命令行啟動(dòng)
$ node app.js
express生成器
通過(guò)應(yīng)用生成器工具 express 可以快速創(chuàng)建一個(gè)應(yīng)用的骨架。
1.安裝以下命令
$ npm install express-generator -g
2.在當(dāng)前目錄創(chuàng)建myapp的應(yīng)用,運(yùn)行以下命令
$ express myapp $ cd myapp $ npm install> set DEBUG=myapp & npm start
通過(guò) Express 應(yīng)用生成器創(chuàng)建的應(yīng)用一般都有如下目錄結(jié)構(gòu):
├── app.js ├── bin │ └── www ├── package.json ├── public │ ├── images │ ├── javascripts │ └── stylesheets │ └── style.css ├── routes │ ├── index.js │ └── users.js └── views ├── error.jade ├── index.jade └── layout.jade 7 directories, 9 files
express路由
路由(Routing)是由一個(gè) URI(或者叫路徑)和一個(gè)特定的 HTTP 方法(GET、POST 等)組成的,涉及到應(yīng)用如何響應(yīng)客戶端對(duì)某個(gè)網(wǎng)站節(jié)點(diǎn)的訪問(wèn)。每一個(gè)路由都可以有一個(gè)或者多個(gè)處理器函數(shù),當(dāng)匹配到路由時(shí),這個(gè)/些函數(shù)將被執(zhí)行。
路由的定義由如下結(jié)構(gòu)組成:app.METHOD(PATH, HANDLER)。其中,app 是一個(gè) express 實(shí)例;METHOD 是某個(gè) HTTP 請(qǐng)求方式中的一個(gè);PATH 是服務(wù)器端的路徑;HANDLER 是當(dāng)路由匹配到時(shí)需要執(zhí)行的函數(shù)。
以下是一些常見(jiàn)的路由代碼:
var express = require('express');
var app = express();
// respond with "hello world" when a GET request is made to the homepage
app.get('/', function(req, res) {
res.send('hello world');
});
// POST method route
app.post('/', function (req, res) {
res.send('POST request to the homepage');
});
//app.all() 是一個(gè)特殊的路由方法,沒(méi)有任何 HTTP 方法與其對(duì)應(yīng),它的作用是對(duì)于一個(gè)路徑上的所有請(qǐng)求加載中間件。
app.all('/secret', function (req, res, next) {
console.log('Accessing the secret section ...');
next(); // pass control to the next handler
});
使用字符串模式的路由路徑示例:字符 ?、+、* 和 () 是正則表達(dá)式的子集,- 和 . 在基于字符串的路徑中按照字面值解釋。
// 匹配 acd 和 abcd
app.get('/ab?cd', function(req, res) {
res.send('ab?cd');
});
// 匹配 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');
});
// 匹配 /abe 和 /abcde
app.get('/ab(cd)?e', function(req, res) {
res.send('ab(cd)?e');
});
//使用正則表達(dá)式的路由路徑示例:
// 匹配任何路徑中含有 a 的路徑:
app.get(/a/, function(req, res) {
res.send('/a/');
});
// 匹配 butterfly、dragonfly,不匹配 butterflyman、dragonfly man等
app.get(/.*fly$/, function(req, res) {
res.send('/.*fly$/');
});
路由句柄
可以為請(qǐng)求處理提供多個(gè)回調(diào)函數(shù),其行為類似 中間件。唯一的區(qū)別是這些回調(diào)函數(shù)有可能調(diào)用 next('route') 方法而略過(guò)其他路由回調(diào)函數(shù)。
路由句柄有多種形式,可以是一個(gè)函數(shù)、一個(gè)函數(shù)數(shù)組,或者是兩者混合,如下所示:
//使用多個(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]);
響應(yīng)方法
下表中響應(yīng)對(duì)象(res)的方法向客戶端返回響應(yīng),終結(jié)請(qǐng)求響應(yīng)的循環(huán)。如果在路由句柄中一個(gè)方法也不調(diào)用,來(lái)自客戶端的請(qǐng)求會(huì)一直掛起。
方法 描述:
- res.download() 提示下載文件。
- 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.sendStatus() 設(shè)置響應(yīng)狀態(tài)代碼,并將其以字符串形式作為響應(yīng)體的一部分發(fā)送。
app.route()
可使用 app.route() 創(chuàng)建路由路徑的鏈?zhǔn)铰酚删浔?。由于路徑在一個(gè)地方指定,這樣做有助于創(chuàng)建模塊化的路由,而且減少了代碼冗余和拼寫(xiě)錯(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)建模塊化、可掛載的路由句柄。Router 實(shí)例是一個(gè)完整的中間件和路由系統(tǒng),因此常稱其為一個(gè) “mini-app”。
在 app 目錄下創(chuàng)建名為 birds.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)用中加載路由模塊:
var birds = require('./birds');
...
app.use('/birds', birds);
應(yīng)用即可處理發(fā)自 /birds 和 /birds/about 的請(qǐng)求,并且調(diào)用為該路由指定的 timeLog 中間件。
利用 Express 托管靜態(tài)文件
通過(guò) Express 內(nèi)置的 express.static 可以方便地托管靜態(tài)文件,例如圖片、CSS、JavaScript 文件等。
將靜態(tài)資源文件所在的目錄作為參數(shù)傳遞給 express.static 中間件就可以提供靜態(tài)資源文件的訪問(wèn)了。例如,假設(shè)在 public 目錄放置了圖片、CSS 和 JavaScript 文件,你就可以:
app.use(express.static('public'));
現(xiàn)在,public 目錄下面的文件就可以訪問(wèn)了。
http://localhost:3000/images/kitten.jpg http://localhost:3000/css/style.css http://localhost:3000/js/app.js http://localhost:3000/images/bg.png http://localhost:3000/hello.html
如果你的靜態(tài)資源存放在多個(gè)目錄下面,你可以多次調(diào)用 express.static 中間件:
app.use(express.static('public'));
app.use(express.static('files'));
如果你希望所有通過(guò) express.static 訪問(wèn)的文件都存放在一個(gè)“虛擬(virtual)”目錄(即目錄根本不存在)下面,可以通過(guò)為靜態(tài)資源目錄指定一個(gè)掛載路徑的方式來(lái)實(shí)現(xiàn),如下所示:
app.use('/static', express.static('public'));
現(xiàn)在,你就愛(ài)可以通過(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
常見(jiàn)問(wèn)題
如何處理 404 ?
在 Express 中,404 并不是一個(gè)錯(cuò)誤(error)。因此,錯(cuò)誤處理器中間件并不捕獲 404。這是因?yàn)?404 只是意味著某些功能沒(méi)有實(shí)現(xiàn)。也就是說(shuō),Express 執(zhí)行了所有中間件、路由之后還是沒(méi)有獲取到任何輸出。你所需要做的就是在其所有他中間件的后面添加一個(gè)處理 404 的中間件。如下:
app.use(function(req, res, next) {
res.status(404).send('Sorry cant find that!');
});
Express 支持哪些模板引擎?
Express 支持任何符合 (path, locals, callback) 接口規(guī)范的模板引擎。
如何渲染純 HTML 文件?
不需要!無(wú)需通過(guò) res.render() 渲染 HTML。你可以通過(guò) res.sendFile() 直接對(duì)外輸出 HTML 文件。如果你需要對(duì)外提供的資源文件很多,可以使用 express.static() 中間件。
相關(guān)文章
剖析Node.js異步編程中的回調(diào)與代碼設(shè)計(jì)模式
這篇文章主要介紹了Node.js異步編程中的回調(diào)與代碼設(shè)計(jì)模式,雖然大多數(shù)場(chǎng)合回調(diào)編寫(xiě)時(shí)的長(zhǎng)串括號(hào)不怎么好看,但Node的異步性能確實(shí)很好,需要的朋友可以參考下2016-02-02
詳解Node.js利用node-git-server快速搭建git服務(wù)器
本篇文章主要介紹了詳解Node.js利用node-git-server快速搭建git服務(wù)器,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-09-09
用node-webkit把web應(yīng)用打包成桌面應(yīng)用(windows環(huán)境)
這篇文章主要介紹了windows環(huán)境下用node-webkit把web應(yīng)用打包成桌面應(yīng)用的教程,需要的朋友可以參考下2018-02-02
express框架通過(guò)ejs模板渲染輸出頁(yè)面實(shí)例分析
這篇文章主要介紹了express框架通過(guò)ejs模板渲染輸出頁(yè)面的方法,結(jié)合實(shí)例形式分析了express框架使用ejs模版引擎渲染輸出的相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2023-05-05
使用nodejs連接mySQL寫(xiě)接口全過(guò)程(增刪改查)
這篇文章主要給大家介紹了關(guān)于使用nodejs連接mySQL寫(xiě)接口(增刪改查)的相關(guān)資料,MySQL是一種常用的關(guān)系型數(shù)據(jù)庫(kù),它與Node.js的結(jié)合可以提供強(qiáng)大的數(shù)據(jù)存儲(chǔ)和檢索功能,需要的朋友可以參考下2023-12-12
基于Node.js + WebSocket打造即時(shí)聊天程序嗨聊
這篇文章主要介紹了基于Node.js + WebSocket打造即時(shí)聊天程序,有興趣的可以了解一下。2016-11-11
Nodejs讀取本地json文件,輸出json數(shù)據(jù)接口方式
這篇文章主要介紹了Nodejs讀取本地json文件,輸出json數(shù)據(jù)接口方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10

