【Node Hero】4. 第一個 Node.js HTTP 服務器

本文轉載自:衆成翻譯
譯者:網絡埋伏紀事
連接:http://www.zcfy.cc/article/1750
原文:https://blog.risingstack.com/your-first-node-js-http-server/html

本章我會指導你啓動一個簡單的 Node.js HTTP 服務器,並開始爲請求服務。node

Node.js 服務器的 http 模塊

當開始在 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.icoapi

  • if (err): 錯誤處理 - 若是端口已被佔用,或者服務器由於其它緣由不能啓動,就會在這裏獲得通知瀏覽器

http 模塊是很低層的 - 用上面的代碼片斷建立複雜的 Web 應用程序是很耗時間的。這就是爲何咱們常常會爲項目選用一個框架的緣由。有不少框架能夠選,可是最重要的是這些:服務器

本章和下一章咱們打算用 Express,由於在 NPM 上能夠找到的 Express 模塊最多。

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.getapp.postapp.put 等定義應用程序的路由。它們會被翻譯爲對應的 HTTP 動詞。

Express 實現的最強大概念之一是中間件模式。

中間件

能夠把中間件看成是 Unix 管道,可是是對 HTTP 請求的管道。

Express middlewares for building a Node.js HTTP server

在圖中你能夠看到一個請求是如何經過 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 回調 - 它能夠用來將多個錯誤處理器鏈在一塊兒。

渲染 HTML

至此,咱們已經瞭解瞭如何發送 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 發生了什麼。爲此,能夠傳遞以下環境變量給 Express:DEBUG=express*

必須用以下方式啓動 Node.js HTTP 服務器:

$ DEBUG=express* node index.js

總結

本章學習瞭如何從頭開始建立第一個 Node.js HTTP 服務器。我推薦用 Express 開始,而後隨意去嘗試。

下章會學習如何從數據庫獲取信息

圖片描述

相關文章
相關標籤/搜索