本文轉載自:衆成翻譯
譯者:網絡埋伏紀事
連接:http://www.zcfy.cc/article/1750
原文:https://blog.risingstack.com/your-first-node-js-http-server/html
本章我會指導你啓動一個簡單的 Node.js HTTP 服務器,並開始爲請求服務。node
當開始在 Node.js 中構建基於 HTTP 的應用程序時,內置的 http
/https
模塊就是你要與之交互的模塊。數據庫
如今,咱們開始建立第一個 Node.js HTTP 服務器!咱們將 require http
模塊,並將服務器綁定到 3000
端口來監聽。express
// index.js 的內容 const http = require('http') const port = 3000 const requestHandler = (request, response) => { console.log(request.url) response.end('Hello Node.js Server!') } const server = http.createServer(requestHandler) server.listen(port, (err) => { if (err) { return console.log('something bad happened', err) } console.log(`server is listening on ${port}`) })
能夠用以下命令啓動:npm
$ node index.js
這裏要注意:json
requestHandler
: 每次請求到達服務器時,該函數都會被調用。若是從瀏覽器訪問 localhost:3000
,就會出現兩條日誌信息:一條是 /
,一條是 favicon.ico
。api
if (err)
: 錯誤處理 - 若是端口已被佔用,或者服務器由於其它緣由不能啓動,就會在這裏獲得通知瀏覽器
http
模塊是很低層的 - 用上面的代碼片斷建立複雜的 Web 應用程序是很耗時間的。這就是爲何咱們常常會爲項目選用一個框架的緣由。有不少框架能夠選,可是最重要的是這些:服務器
本章和下一章咱們打算用 Express,由於在 NPM 上能夠找到的 Express 模塊最多。
快速、開放、極簡的 Node.js Web 框架 - http://expressjs.com/
將 Express 添加到項目中的惟一方法是 NPM 安裝:
$ npm install express --save
安裝完 Express 後,咱們來看看如何建立一個像之前那樣的應用程序:
const express = require('express') const app = express() const port = 3000 app.get('/', (request, response) => { response.send('Hello from Express!') }) app.listen(port, (err) => { if (err) { return console.log('something bad happened', err) } console.log('server is listening on ${port}') })
這裏你必須注意到的最大區別是,Express 默認給了一個路由器。不須要手動檢測 URL 來判斷要作什麼,而是用 app.get
、app.post
、app.put
等定義應用程序的路由。它們會被翻譯爲對應的 HTTP 動詞。
Express 實現的最強大概念之一是中間件模式。
能夠把中間件看成是 Unix 管道,可是是對 HTTP 請求的管道。
在圖中你能夠看到一個請求是如何經過 Express 應用程序的。它經歷了三個中間件。每一箇中間件均可以修改它,而後基於業務邏輯,要麼第三個中間件送回一個響應,要麼將它送到一個路由處理器。
在實踐中,能夠按這種方式作:
const express = require('express') const app = express() app.use((request, response, next) => { console.log(request.headers) next() }) app.use((request, response, next) => { request.chance = Math.random() next() }) app.get('/', (request, response) => { response.json({ chance: request.chance }) }) app.listen(3000)
這裏要注意:
app.use
: 在這裏定義中間件 - 它帶有三個參數的函數,第一個是請求,第二個是響應,第三個是 next
回調。調用 next
就是通知 Express 能夠跳到下一個中間件,或者路由處理器。
第一個中間件只是記錄請求頭,而後當即調用下一個。
第二個中間件給請求添加一個特殊屬性 - 這是中間件模式最強大的功能之一。你的中間件能夠向 request 對象添加額外的數據,這個數據能夠被下游中間件讀取或修改。
在全部框架中,正確的錯誤處理是相當重要的。在 Express 中,必須建立特殊的中間件函數來實現 - 一個帶有四個參數的中間件:
const express = require('express') const app = express() app.get('/', (request, response) => { throw new Error('oops') }) app.use((err, request, response, next) => { // log the error, for now just console.log console.log(err) response.status(500).send('Something broke!') })
這裏要注意:
錯誤處理函數應該是用 app.use
添加的最後一個函數。
錯誤處理器有一個 next
回調 - 它能夠用來將多個錯誤處理器鏈在一塊兒。
至此,咱們已經瞭解瞭如何發送 JSON 響應 - 是時候學習如何用簡單方法渲染 HTML 了。爲此,咱們要使用 express-handlebars 中的 handlebars 包。
首先,建立以下的目錄結構:
├── index.js └── views ├── home.hbs └── layouts └── main.hbs
以後,用以下代碼片斷填充 index.js
:
// index.js const path = require('path') const express = require('express') const exphbs = require('express-handlebars') const app = express() app.engine('.hbs', exphbs({ defaultLayout: 'main', extname: '.hbs', layoutsDir: path.join(__dirname, 'views/layouts') })) app.set('view engine', '.hbs') app.set('views', path.join(__dirname, 'views'))
上述代碼初始化 handlebars
引擎,將佈局目錄設置爲 views/layouts
。佈局將會存在這個目錄中。
設置好後,能夠把初始 html
放進 main.hbs
中 - 爲保持簡單,咱們就用這個:
<html> <head> <title>Express handlebars</title> </head> <body> {{{body}}} </body> </html>
這裏的 {{{body}}}
佔位符,就是放內容的地方 - 下面咱們建立 home.hbs
!
<h2>Hello {{name}}<h2>
要讓它起做用,咱們得作最後一件事情:給 Express 應用程序添加一個路由處理器:
app.get('/', (request, response) => { response.render('home', { name: 'John' }) })
render
方法帶有兩個參數:
第一個是視圖的名稱;
第二個是要渲染的數據。
一旦調用這個端點,會獲得以下的 HTML:
<html> <head> <title>Express handlebars</title> </head> <body> <h2>Hello John<h2> </body> </html>
這只是冰山一角 - 要學習如何添加更多佈局甚至局部模板,請參考官方 express-handlebars 文檔。
在某些狀況下,你可能須要看到應用程序正在運行時 Express 發生了什麼。爲此,能夠傳遞以下環境變量給 Express:DEBUG=express*
。
必須用以下方式啓動 Node.js HTTP 服務器:
$ DEBUG=express* node index.js
本章學習瞭如何從頭開始建立第一個 Node.js HTTP 服務器。我推薦用 Express 開始,而後隨意去嘗試。
下章會學習如何從數據庫獲取信息。