首頁 web前端 js教程 學習nodejs:express 入門和基礎知識

學習nodejs:express 入門和基礎知識

Sep 12, 2018 pm 05:10 PM
express js nodejs

本章為大家介紹學習nodejs:express 入門與基礎知識。那麼什麼是express,express 是一個自身功能極簡,完全是由路由和中間件構成一個的 web 開發框架:從本質上來說,一個express 應用就是在呼叫各種中間件。有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

初始化

新目錄myapp,專案初始化

$ npm init
登入後複製

安裝express

$ npm install express --save
登入後複製

#建立一個hello world實例

進入myapp目錄,建立一個名為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);
});
登入後複製

上面的程式碼啟動一個服務並監聽從3000 端口進入的所有連線請求。他將對所有 (/) URL 或 路由 傳回 “Hello World!” 字串。對於其他所有路徑全部傳回 404 Not Found。

透過以下命令列啟動

$ node app.js
登入後複製

express生成器

透過應用程式產生器工具express 可以快速建立一個應用的骨架。

1.安裝以下指令

$ npm install express-generator -g
登入後複製

2.在目前目錄建立myapp的應用,執行下列指令

$ express myapp
$ cd myapp 
$ npm install> set DEBUG=myapp & npm start
登入後複製

透過Express 應用程式產生器所建立的應用程式一般都有如下目錄結構:

├── 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)是由一個URI(或叫路徑)和一個特定的 HTTP 方法( GET、POST 等)組成的,涉及應用如何回應客戶端對某個網站節點的存取。每一個路由都可以有一個或多個處理器函數,當配對到路由時,這個/些函數將會被執行。

路由的定義由以下結構組成:app.METHOD(PATH, HANDLER)。其中,app 是一個 express 實例;METHOD 是某個 HTTP 請求方式中的一個;PATH 是伺服器端的路徑;HANDLER 是當路由匹配到時需要執行的函數。

以下是一些常見的路由程式碼:

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() 是一个特殊的路由方法,没有任何 HTTP 方法与其对应,它的作用是对于一个路径上的所有请求加载中间件。
app.all('/secret', function (req, res, next) {
  console.log('Accessing the secret section ...');
  next(); // pass control to the next handler
});
登入後複製

使用字串模式的路由路徑範例:字元?、 、* 和() 是正規表示式的子集,- 和. 在基於字串的路徑中按照字面值解釋。

// 匹配 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');
});

//使用正则表达式的路由路径示例:
// 匹配任何路径中含有 a 的路径:
app.get(/a/, function(req, res) {
  res.send('/a/');
});

// 匹配 butterfly、dragonfly,不匹配 butterflyman、dragonfly man等
app.get(/.*fly$/, function(req, res) {
  res.send('/.*fly$/');
});
登入後複製

路由句柄

可以為請求處理提供多個回呼函數,其行為類似 中介軟體。唯一的差異是這些回呼函數有可能呼叫 next('route') 方法而略過其他路由回呼函數。

路由句柄有多種形式,可以是一個函數、一個函數數組,或是兩者混合,如下:

//使用多个回调函数处理路由(记得指定 next 对象):
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!');
});

//使用回调函数数组处理路由:
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]);
登入後複製

回應方法

下表中回應物件(res)的方法向客戶端回傳回應,終結請求回應的循環。如果在路由句柄中一個方法也不調用,來自客戶端的請求會一直掛起。

方法 描述:
   res.download() 提示下載檔案。
   res.end() 終結回應處理流程。
   res.JSON() 傳送一個 JSON 格式的回應。
   res.jsonp() 傳送一個支援 JSONP 的 JSON 格式的回應。
   res.redirect() 重定向請求。
   res.render() 渲染視圖範本。
   res.send() 發送各種類型的回應。
   res.sendFile 以八位元位元組流的形式傳送檔案。
   res.sendStatus() 設定回應狀態碼,並將其以字串形式作為回應體的一部分傳送。

app.route()

可使用 app.route() 建立路由路徑的鍊式路由句柄。由於路徑在一個地方指定,這樣做有助於創建模組化的路由,而且減少了程式碼冗餘和拼寫錯誤。

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 類別建立模組化、可掛載的路由句柄。 Router 實例是一個完整的中間件和路由系統,因此常稱其為一個 “mini-app”。

在app 目錄下建立名為birds.js 的文件,內容如下:

var express = require('express');
var router = express.Router();
// 该路由使用的中间件
router.use(
	function timeLog(req, res, next) {
		console.log('Time: ', Date.now());
		next();
	});
// 定义网站主页的路由
router.get('/', function(req, res) {
	res.send('Birds home page');
});
// 定义 about 页面的路由
router.get('/about', function(req, res) {
	res.send('About birds');
});
module.exports = router;
登入後複製

然後在應用程式中載入路由模組:

var birds = require('./birds');
...
app.use('/birds', birds);
登入後複製

應用程式即可處理髮自/birds 和/birds/about 的請求,並且呼叫為該路由指定的timeLog 中間件。

利用Express 託管靜態檔案

透過Express 內建的express.static 可以方便地託管靜態文件,例如圖片、CSS、JavaScript 文件等。

將靜態資源檔案所在的目錄作為參數傳遞給 express.static 中間件就可以提供靜態資源檔案的存取權了。例如,假設在 public 目錄放置了圖片、CSS 和 JavaScript 文件,你就可以:

app.use(express.static('public'));
登入後複製

現在,public 目錄下面的文件就可以存取了。

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
登入後複製

如果你的靜態資源存放在多個目錄下面,你可以多次呼叫 express.static 中介軟體:

app.use(express.static('public'));
app.use(express.static('files'));
登入後複製

如果你希望所有通过 express.static 访问的文件都存放在一个“虚拟(virtual)”目录(即目录根本不存在)下面,可以通过为静态资源目录指定一个挂载路径的方式来实现,如下所示:

app.use('/static', express.static('public'));
登入後複製

现在,你就爱可以通过带有 “/static” 前缀的地址来访问 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
登入後複製

常见问题

如何处理 404 ?

在 Express 中,404 并不是一个错误(error)。因此,错误处理器中间件并不捕获 404。这是因为 404 只是意味着某些功能没有实现。也就是说,Express 执行了所有中间件、路由之后还是没有获取到任何输出。你所需要做的就是在其所有他中间件的后面添加一个处理 404 的中间件。如下:

app.use(function(req, res, next) {  
res.status(404).send('Sorry cant find that!');
});
登入後複製

Express 支持哪些模板引擎?

Express 支持任何符合 (path, locals, callback) 接口规范的模板引擎。

如何渲染纯 HTML 文件?

不需要!无需通过 res.render() 渲染 HTML。你可以通过 res.sendFile() 直接对外输出 HTML 文件。如果你需要对外提供的资源文件很多,可以使用 express.static() 中间件。

以上是學習nodejs:express 入門和基礎知識的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

nodejs是後端框架嗎 nodejs是後端框架嗎 Apr 21, 2024 am 05:09 AM

Node.js 可作為後端框架使用,因為它提供高效能、可擴展性、跨平台支援、豐富的生態系統和易於開發等功能。

nodejs怎麼連接mysql資料庫 nodejs怎麼連接mysql資料庫 Apr 21, 2024 am 06:13 AM

要連接 MySQL 資料庫,需要遵循以下步驟:安裝 mysql2 驅動程式。使用 mysql2.createConnection() 建立連接對象,其中包含主機位址、連接埠、使用者名稱、密碼和資料庫名稱。使用 connection.query() 執行查詢。最後使用 connection.end() 結束連線。

nodejs中的全域變數有哪些 nodejs中的全域變數有哪些 Apr 21, 2024 am 04:54 AM

Node.js 中存在以下全域變數:全域物件:global核心模組:process、console、require執行階段環境變數:__dirname、__filename、__line、__column常數:undefined、null、NaN、Infinity、-Infinity

nodejs安裝目錄裡的npm與npm.cmd檔有什麼差別 nodejs安裝目錄裡的npm與npm.cmd檔有什麼差別 Apr 21, 2024 am 05:18 AM

Node.js 安裝目錄中有兩個與 npm 相關的文件:npm 和 npm.cmd,區別如下:擴展名不同:npm 是可執行文件,npm.cmd 是命令視窗快捷方式。 Windows 使用者:npm.cmd 可以在命令提示字元中使用,npm 只能從命令列執行。相容性:npm.cmd 特定於 Windows 系統,npm 跨平台可用。使用建議:Windows 使用者使用 npm.cmd,其他作業系統使用 npm。

nodejs和java的差別大嗎 nodejs和java的差別大嗎 Apr 21, 2024 am 06:12 AM

Node.js 和 Java 的主要差異在於設計和特性:事件驅動與執行緒驅動:Node.js 基於事件驅動,Java 基於執行緒驅動。單執行緒與多執行緒:Node.js 使用單執行緒事件循環,Java 使用多執行緒架構。執行時間環境:Node.js 在 V8 JavaScript 引擎上運行,而 Java 在 JVM 上運行。語法:Node.js 使用 JavaScript 語法,而 Java 使用 Java 語法。用途:Node.js 適用於 I/O 密集型任務,而 Java 適用於大型企業應用程式。

nodejs是後端開發語言嗎 nodejs是後端開發語言嗎 Apr 21, 2024 am 05:09 AM

是的,Node.js 是一種後端開發語言。它用於後端開發,包括處理伺服器端業務邏輯、管理資料庫連接和提供 API。

nodejs和java選哪個 nodejs和java選哪個 Apr 21, 2024 am 04:40 AM

Node.js 和 Java 在 Web 開發中各有優劣,因此選擇取決於專案需求。 Node.js 擅長即時應用程式、快速開發和微服務架構,而 Java 則在企業級支援、效能和安全性方面佔優。

nodejs可以寫前端嗎 nodejs可以寫前端嗎 Apr 21, 2024 am 05:00 AM

是的,Node.js可用於前端開發,主要優勢包括高效能、豐富的生態系統和跨平台相容性。需要考慮的注意事項有學習曲線、工具支援和社群規模較小。

See all articles