摘要:本文轉載自眾成翻譯譯者網絡埋伏紀事鏈接原文本章我會指導你啟動一個簡單的服務器,并開始為請求服務。現在,我們開始創建第一個服務器我們將模塊,并將服務器綁定到端口來監聽。必須用如下方式啟動服務器總結本章學習了如何從頭開始創建第一個服務器。
本文轉載自:眾成翻譯
譯者:網絡埋伏紀事
鏈接:http://www.zcfy.cc/article/1750
原文:https://blog.risingstack.com/your-first-node-js-http-server/
本章我會指導你啟動一個簡單的 Node.js HTTP 服務器,并開始為請求服務。
Node.js 服務器的 http 模塊當開始在 Node.js 中構建基于 HTTP 的應用程序時,內置的 http/https 模塊就是你要與之交互的模塊。
現在,我們開始創建第一個 Node.js HTTP 服務器!我們將 require http 模塊,并將服務器綁定到 3000 端口來監聽。
// 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}`) })
可以用如下命令啟動:
$ node index.js
這里要注意:
requestHandler: 每次請求到達服務器時,該函數都會被調用。如果從瀏覽器訪問 localhost:3000,就會出現兩條日志信息:一條是 /,一條是 favicon.ico。
if (err): 錯誤處理 - 如果端口已被占用,或者服務器因為其它原因不能啟動,就會在這里得到通知
http 模塊是很低層的 - 用上面的代碼片段創建復雜的 Web 應用程序是很耗時間的。這就是為什么我們經常會為項目選用一個框架的原因。有很多框架可以選,但是最重要的是這些:
express
hapi
koa
restify
本章和下一章我們打算用 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.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 回調 - 它可以用來將多個錯誤處理器鏈在一起。
渲染 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 中 - 為保持簡單,我們就用這個:
Express handlebars {{{body}}}
這里的 {{{body}}} 占位符,就是放內容的地方 - 下面我們創建 home.hbs!
Hello {{name}}
要讓它起作用,我們得做最后一件事情:給 Express 應用程序添加一個路由處理器:
app.get("/", (request, response) => { response.render("home", { name: "John" }) })
render 方法帶有兩個參數:
第一個是視圖的名稱;
第二個是要渲染的數據。
一旦調用這個端點,會得到如下的 HTML:
Express handlebars Hello John
這只是冰山一角 - 要學習如何添加更多布局甚至局部模板,請參考官方 express-handlebars 文檔。
調試 Express在某些情況下,你可能需要看到應用程序正在運行時 Express 發生了什么。為此,可以傳遞如下環境變量給 Express:DEBUG=express*。
必須用如下方式啟動 Node.js HTTP 服務器:
$ DEBUG=express* node index.js總結
本章學習了如何從頭開始創建第一個 Node.js HTTP 服務器。我推薦用 Express 開始,然后隨意去嘗試。
下章會學習如何從數據庫獲取信息。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/84980.html
摘要:使用一個事件驅動的非阻塞式的模型,讓它輕量而高效。也就是說提供了用編寫服務器的可能性,這種服務器具有令人難以置信的性能。正如官方聲明所說是一個使用與瀏覽器相同引擎的運行時。這意味著有兩個發布版本穩定版和試驗版。 本文轉載自:眾成翻譯譯者:網絡埋伏紀事鏈接:http://www.zcfy.cc/article/1748原文:https://blog.risingstack.com/nod...
摘要:異步編程在傳統編程實踐中,大多數操作都是同步發生的。中的異步編程異步是一種輸入輸出處理的形式,它允許在傳輸完成之前,其它處理能繼續進行。 本文轉載自:眾成翻譯譯者:網絡埋伏紀事鏈接:http://www.zcfy.cc/article/1759原文:https://blog.risingstack.com/node-hero-async-programming-in-node-js/ ...
摘要:是一種設計用于關系型數據庫的查詢語言。另一方面,數據庫在最近十年變得相當流行。大多數數據庫都有驅動程序可以用,它們在上也有庫。我們已經完成了在中使用數據庫所必須知道的所有基礎知識。 本文轉載自:眾成翻譯譯者:網絡埋伏紀事鏈接:http://www.zcfy.cc/article/1751原文:https://blog.risingstack.com/node-js-database-t...
摘要:本文轉載自眾成翻譯譯者網絡埋伏紀事鏈接原文本教程中將學習如何使用和實現一個本地身份驗證策略。我們將有一個用戶頁,一個備注頁,和一些與身份驗證相關的功能。下一步下一章主要涉及應用程序的單元測試。你會學習單元測試測試金字塔測試替代等概念。 本文轉載自:眾成翻譯譯者:網絡埋伏紀事鏈接:http://www.zcfy.cc/article/1755原文:https://blog.risings...
摘要:狀態碼描述了請求的結果,它對錯誤處理是必不可少的。響應還沒完成成功這些狀態碼表示請求被接收并正確處理了。服務器錯誤當服務器由于某些錯誤不能完成有效的請求時,就發送這些狀態碼。 本文轉載自:眾成翻譯譯者:網絡埋伏紀事鏈接:http://www.zcfy.cc/article/1758原文:https://blog.risingstack.com/node-hero-node-js-req...
閱讀 1914·2021-09-23 11:21
閱讀 1701·2019-08-29 17:27
閱讀 1059·2019-08-29 17:03
閱讀 728·2019-08-29 15:07
閱讀 1922·2019-08-29 11:13
閱讀 2381·2019-08-26 12:14
閱讀 922·2019-08-26 11:52
閱讀 1733·2019-08-23 17:09