摘要:本文轉(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.get、app.post、app.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
摘要:使用一個事件驅(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...
摘要:異步編程在傳統(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/ ...
摘要:是一種設(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...
摘要:本文轉(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...
摘要:狀態(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...
閱讀 1911·2021-09-23 11:21
閱讀 1697·2019-08-29 17:27
閱讀 1056·2019-08-29 17:03
閱讀 723·2019-08-29 15:07
閱讀 1920·2019-08-29 11:13
閱讀 2379·2019-08-26 12:14
閱讀 919·2019-08-26 11:52
閱讀 1732·2019-08-23 17:09