国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【Node Hero】4. 第一個 Node.js HTTP 服務(wù)器

Coly / 2054人閱讀

摘要:本文轉(zhuǎn)載自眾成翻譯譯者網(wǎng)絡(luò)埋伏紀(jì)事鏈接原文本章我會指導(dǎo)你啟動一個簡單的服務(wù)器,并開始為請求服務(wù)。現(xiàn)在,我們開始創(chuàng)建第一個服務(wù)器我們將模塊,并將服務(wù)器綁定到端口來監(jiān)聽。必須用如下方式啟動服務(wù)器總結(jié)本章學(xué)習(xí)了如何從頭開始創(chuàng)建第一個服務(wù)器。

本文轉(zhuǎn)載自:眾成翻譯
譯者:網(wǎng)絡(luò)埋伏紀(jì)事
鏈接:http://www.zcfy.cc/article/1750
原文:https://blog.risingstack.com/your-first-node-js-http-server/

本章我會指導(dǎo)你啟動一個簡單的 Node.js HTTP 服務(wù)器,并開始為請求服務(wù)。

Node.js 服務(wù)器的 http 模塊

當(dāng)開始在 Node.js 中構(gòu)建基于 HTTP 的應(yīng)用程序時,內(nèi)置的 http/https 模塊就是你要與之交互的模塊。

現(xiàn)在,我們開始創(chuàng)建第一個 Node.js HTTP 服務(wù)器!我們將 require http 模塊,并將服務(wù)器綁定到 3000 端口來監(jiān)聽。

// index.js 的內(nèi)容
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}`)
})

可以用如下命令啟動:

$ node index.js

這里要注意:

requestHandler: 每次請求到達(dá)服務(wù)器時,該函數(shù)都會被調(diào)用。如果從瀏覽器訪問 localhost:3000,就會出現(xiàn)兩條日志信息:一條是 /,一條是 favicon.ico

if (err): 錯誤處理 - 如果端口已被占用,或者服務(wù)器因?yàn)槠渌虿荒軉樱蜁谶@里得到通知

http 模塊是很低層的 - 用上面的代碼片段創(chuàng)建復(fù)雜的 Web 應(yīng)用程序是很耗時間的。這就是為什么我們經(jīng)常會為項(xiàng)目選用一個框架的原因。有很多框架可以選,但是最重要的是這些:

express

hapi

koa

restify

本章和下一章我們打算用 Express,因?yàn)樵?NPM 上可以找到的 Express 模塊最多。

Express

快速、開放、極簡的 Node.js Web 框架 - http://expressjs.com/

將 Express 添加到項(xiàng)目中的唯一方法是 NPM 安裝:

$ npm install express --save

安裝完 Express 后,我們來看看如何創(chuàng)建一個像以前那樣的應(yīng)用程序:

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}")
})

這里你必須注意到的最大區(qū)別是,Express 默認(rèn)給了一個路由器。不需要手動檢測 URL 來判斷要做什么,而是用 app.getapp.postapp.put 等定義應(yīng)用程序的路由。它們會被翻譯為對應(yīng)的 HTTP 動詞。

Express 實(shí)現(xiàn)的最強(qiáng)大概念之一是中間件模式。

中間件

可以把中間件當(dāng)作是 Unix 管道,但是是對 HTTP 請求的管道。

在圖中你可以看到一個請求是如何通過 Express 應(yīng)用程序的。它經(jīng)歷了三個中間件。每個中間件都可以修改它,然后基于業(yè)務(wù)邏輯,要么第三個中間件送回一個響應(yīng),要么將它送到一個路由處理器。

在實(shí)踐中,可以按這種方式做:

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: 在這里定義中間件 - 它帶有三個參數(shù)的函數(shù),第一個是請求,第二個是響應(yīng),第三個是 next 回調(diào)。調(diào)用 next 就是通知 Express 可以跳到下一個中間件,或者路由處理器。

第一個中間件只是記錄請求頭,然后立即調(diào)用下一個。

第二個中間件給請求添加一個特殊屬性 - 這是中間件模式最強(qiáng)大的功能之一。你的中間件可以向 request 對象添加額外的數(shù)據(jù),這個數(shù)據(jù)可以被下游中間件讀取或修改。

錯誤處理

在所有框架中,正確的錯誤處理是至關(guān)重要的。在 Express 中,必須創(chuàng)建特殊的中間件函數(shù)來實(shí)現(xiàn) - 一個帶有四個參數(shù)的中間件:

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!")
})

這里要注意:

錯誤處理函數(shù)應(yīng)該是用 app.use 添加的最后一個函數(shù)。

錯誤處理器有一個 next 回調(diào) - 它可以用來將多個錯誤處理器鏈在一起。

渲染 HTML

至此,我們已經(jīng)了解了如何發(fā)送 JSON 響應(yīng) - 是時候?qū)W習(xí)如何用簡單方法渲染 HTML 了。為此,我們要使用 express-handlebars 中的 handlebars 包。

首先,創(chuàng)建如下的目錄結(jié)構(gòu):

├── 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 引擎,將布局目錄設(shè)置為 views/layouts。布局將會存在這個目錄中。

設(shè)置好后,可以把初始 html 放進(jìn) main.hbs 中 - 為保持簡單,我們就用這個:

  
  
    Express handlebars
  
  
    {{{body}}}
  
  

這里的 {{{body}}} 占位符,就是放內(nèi)容的地方 - 下面我們創(chuàng)建 home.hbs

Hello {{name}}

要讓它起作用,我們得做最后一件事情:給 Express 應(yīng)用程序添加一個路由處理器:

app.get("/", (request, response) => {  
  response.render("home", {
    name: "John"
  })
})

render 方法帶有兩個參數(shù):

第一個是視圖的名稱;

第二個是要渲染的數(shù)據(jù)。

一旦調(diào)用這個端點(diǎn),會得到如下的 HTML:

  
  
    Express handlebars
  
  
    

Hello John

這只是冰山一角 - 要學(xué)習(xí)如何添加更多布局甚至局部模板,請參考官方 express-handlebars 文檔。

調(diào)試 Express

在某些情況下,你可能需要看到應(yīng)用程序正在運(yùn)行時 Express 發(fā)生了什么。為此,可以傳遞如下環(huán)境變量給 Express:DEBUG=express*

必須用如下方式啟動 Node.js HTTP 服務(wù)器:

$ DEBUG=express* node index.js
總結(jié)

本章學(xué)習(xí)了如何從頭開始創(chuàng)建第一個 Node.js HTTP 服務(wù)器。我推薦用 Express 開始,然后隨意去嘗試。

下章會學(xué)習(xí)如何從數(shù)據(jù)庫獲取信息。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/84980.html

相關(guān)文章

  • Node Hero】1. 開始使用 Node.js

    摘要:使用一個事件驅(qū)動的非阻塞式的模型,讓它輕量而高效。也就是說提供了用編寫服務(wù)器的可能性,這種服務(wù)器具有令人難以置信的性能。正如官方聲明所說是一個使用與瀏覽器相同引擎的運(yùn)行時。這意味著有兩個發(fā)布版本穩(wěn)定版和試驗(yàn)版。 本文轉(zhuǎn)載自:眾成翻譯譯者:網(wǎng)絡(luò)埋伏紀(jì)事鏈接:http://www.zcfy.cc/article/1748原文:https://blog.risingstack.com/nod...

    hqman 評論0 收藏0
  • Node Hero】3. 理解異步編程

    摘要:異步編程在傳統(tǒng)編程實(shí)踐中,大多數(shù)操作都是同步發(fā)生的。中的異步編程異步是一種輸入輸出處理的形式,它允許在傳輸完成之前,其它處理能繼續(xù)進(jìn)行。 本文轉(zhuǎn)載自:眾成翻譯譯者:網(wǎng)絡(luò)埋伏紀(jì)事鏈接:http://www.zcfy.cc/article/1759原文:https://blog.risingstack.com/node-hero-async-programming-in-node-js/ ...

    kevin 評論0 收藏0
  • Node Hero】5. Node.js 數(shù)據(jù)庫教程

    摘要:是一種設(shè)計(jì)用于關(guān)系型數(shù)據(jù)庫的查詢語言。另一方面,數(shù)據(jù)庫在最近十年變得相當(dāng)流行。大多數(shù)數(shù)據(jù)庫都有驅(qū)動程序可以用,它們在上也有庫。我們已經(jīng)完成了在中使用數(shù)據(jù)庫所必須知道的所有基礎(chǔ)知識。 本文轉(zhuǎn)載自:眾成翻譯譯者:網(wǎng)絡(luò)埋伏紀(jì)事鏈接:http://www.zcfy.cc/article/1751原文:https://blog.risingstack.com/node-js-database-t...

    Hujiawei 評論0 收藏0
  • Node Hero】8. 使用 Passport.js 進(jìn)行 Node.js 身份驗(yàn)證

    摘要:本文轉(zhuǎn)載自眾成翻譯譯者網(wǎng)絡(luò)埋伏紀(jì)事鏈接原文本教程中將學(xué)習(xí)如何使用和實(shí)現(xiàn)一個本地身份驗(yàn)證策略。我們將有一個用戶頁,一個備注頁,和一些與身份驗(yàn)證相關(guān)的功能。下一步下一章主要涉及應(yīng)用程序的單元測試。你會學(xué)習(xí)單元測試測試金字塔測試替代等概念。 本文轉(zhuǎn)載自:眾成翻譯譯者:網(wǎng)絡(luò)埋伏紀(jì)事鏈接:http://www.zcfy.cc/article/1755原文:https://blog.risings...

    CoderStudy 評論0 收藏0
  • Node Hero】6. Node.js Request 模塊

    摘要:狀態(tài)碼描述了請求的結(jié)果,它對錯誤處理是必不可少的。響應(yīng)還沒完成成功這些狀態(tài)碼表示請求被接收并正確處理了。服務(wù)器錯誤當(dāng)服務(wù)器由于某些錯誤不能完成有效的請求時,就發(fā)送這些狀態(tài)碼。 本文轉(zhuǎn)載自:眾成翻譯譯者:網(wǎng)絡(luò)埋伏紀(jì)事鏈接:http://www.zcfy.cc/article/1758原文:https://blog.risingstack.com/node-hero-node-js-req...

    BlackHole1 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<