摘要:本文轉(zhuǎn)載自眾成翻譯譯者網(wǎng)絡(luò)埋伏紀(jì)事鏈接原文本章我會(huì)指導(dǎo)你啟動(dòng)一個(gè)簡(jiǎn)單的服務(wù)器,并開(kāi)始為請(qǐng)求服務(wù)?,F(xiàn)在,我們開(kāi)始創(chuàng)建第一個(gè)服務(wù)器我們將模塊,并將服務(wù)器綁定到端口來(lái)監(jiān)聽(tīng)。必須用如下方式啟動(dòng)服務(wù)器總結(jié)本章學(xué)習(xí)了如何從頭開(kāi)始創(chuàng)建第一個(gè)服務(wù)器。
本文轉(zhuǎn)載自:眾成翻譯
譯者:網(wǎng)絡(luò)埋伏紀(jì)事
鏈接:http://www.zcfy.cc/article/1750
原文:https://blog.risingstack.com/your-first-node-js-http-server/
本章我會(huì)指導(dǎo)你啟動(dòng)一個(gè)簡(jiǎn)單的 Node.js HTTP 服務(wù)器,并開(kāi)始為請(qǐng)求服務(wù)。
Node.js 服務(wù)器的 http 模塊當(dāng)開(kāi)始在 Node.js 中構(gòu)建基于 HTTP 的應(yīng)用程序時(shí),內(nèi)置的 http/https 模塊就是你要與之交互的模塊。
現(xiàn)在,我們開(kāi)始創(chuàng)建第一個(gè) Node.js HTTP 服務(wù)器!我們將 require http 模塊,并將服務(wù)器綁定到 3000 端口來(lái)監(jiān)聽(tīng)。
// 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}`) })
可以用如下命令啟動(dòng):
$ node index.js
這里要注意:
requestHandler: 每次請(qǐng)求到達(dá)服務(wù)器時(shí),該函數(shù)都會(huì)被調(diào)用。如果從瀏覽器訪(fǎng)問(wèn) localhost:3000,就會(huì)出現(xiàn)兩條日志信息:一條是 /,一條是 favicon.ico。
if (err): 錯(cuò)誤處理 - 如果端口已被占用,或者服務(wù)器因?yàn)槠渌虿荒軉?dòng),就會(huì)在這里得到通知
http 模塊是很低層的 - 用上面的代碼片段創(chuàng)建復(fù)雜的 Web 應(yīng)用程序是很耗時(shí)間的。這就是為什么我們經(jīng)常會(huì)為項(xiàng)目選用一個(gè)框架的原因。有很多框架可以選,但是最重要的是這些:
express
hapi
koa
restify
本章和下一章我們打算用 Express,因?yàn)樵?NPM 上可以找到的 Express 模塊最多。
Express快速、開(kāi)放、極簡(jiǎn)的 Node.js Web 框架 - http://expressjs.com/
將 Express 添加到項(xiàng)目中的唯一方法是 NPM 安裝:
$ npm install express --save
安裝完 Express 后,我們來(lái)看看如何創(chuàng)建一個(gè)像以前那樣的應(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)給了一個(gè)路由器。不需要手動(dòng)檢測(cè) URL 來(lái)判斷要做什么,而是用 app.get、app.post、app.put 等定義應(yīng)用程序的路由。它們會(huì)被翻譯為對(duì)應(yīng)的 HTTP 動(dòng)詞。
Express 實(shí)現(xiàn)的最強(qiáng)大概念之一是中間件模式。
中間件可以把中間件當(dāng)作是 Unix 管道,但是是對(duì) HTTP 請(qǐng)求的管道。
在圖中你可以看到一個(gè)請(qǐng)求是如何通過(guò) Express 應(yīng)用程序的。它經(jīng)歷了三個(gè)中間件。每個(gè)中間件都可以修改它,然后基于業(yè)務(wù)邏輯,要么第三個(gè)中間件送回一個(gè)響應(yīng),要么將它送到一個(gè)路由處理器。
在實(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: 在這里定義中間件 - 它帶有三個(gè)參數(shù)的函數(shù),第一個(gè)是請(qǐng)求,第二個(gè)是響應(yīng),第三個(gè)是 next 回調(diào)。調(diào)用 next 就是通知 Express 可以跳到下一個(gè)中間件,或者路由處理器。
第一個(gè)中間件只是記錄請(qǐng)求頭,然后立即調(diào)用下一個(gè)。
第二個(gè)中間件給請(qǐng)求添加一個(gè)特殊屬性 - 這是中間件模式最強(qiáng)大的功能之一。你的中間件可以向 request 對(duì)象添加額外的數(shù)據(jù),這個(gè)數(shù)據(jù)可以被下游中間件讀取或修改。
錯(cuò)誤處理在所有框架中,正確的錯(cuò)誤處理是至關(guān)重要的。在 Express 中,必須創(chuàng)建特殊的中間件函數(shù)來(lái)實(shí)現(xiàn) - 一個(gè)帶有四個(gè)參數(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!") })
這里要注意:
錯(cuò)誤處理函數(shù)應(yīng)該是用 app.use 添加的最后一個(gè)函數(shù)。
錯(cuò)誤處理器有一個(gè) next 回調(diào) - 它可以用來(lái)將多個(gè)錯(cuò)誤處理器鏈在一起。
渲染 HTML至此,我們已經(jīng)了解了如何發(fā)送 JSON 響應(yīng) - 是時(shí)候?qū)W習(xí)如何用簡(jiǎn)單方法渲染 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。布局將會(huì)存在這個(gè)目錄中。
設(shè)置好后,可以把初始 html 放進(jìn) main.hbs 中 - 為保持簡(jiǎn)單,我們就用這個(gè):
Express handlebars {{{body}}}
這里的 {{{body}}} 占位符,就是放內(nèi)容的地方 - 下面我們創(chuàng)建 home.hbs!
Hello {{name}}
要讓它起作用,我們得做最后一件事情:給 Express 應(yīng)用程序添加一個(gè)路由處理器:
app.get("/", (request, response) => { response.render("home", { name: "John" }) })
render 方法帶有兩個(gè)參數(shù):
第一個(gè)是視圖的名稱(chēng);
第二個(gè)是要渲染的數(shù)據(jù)。
一旦調(diào)用這個(gè)端點(diǎn),會(huì)得到如下的 HTML:
Express handlebars Hello John
這只是冰山一角 - 要學(xué)習(xí)如何添加更多布局甚至局部模板,請(qǐng)參考官方 express-handlebars 文檔。
調(diào)試 Express在某些情況下,你可能需要看到應(yīng)用程序正在運(yùn)行時(shí) Express 發(fā)生了什么。為此,可以傳遞如下環(huán)境變量給 Express:DEBUG=express*。
必須用如下方式啟動(dòng) Node.js HTTP 服務(wù)器:
$ DEBUG=express* node index.js總結(jié)
本章學(xué)習(xí)了如何從頭開(kāi)始創(chuàng)建第一個(gè) Node.js HTTP 服務(wù)器。我推薦用 Express 開(kāi)始,然后隨意去嘗試。
下章會(huì)學(xué)習(xí)如何從數(shù)據(jù)庫(kù)獲取信息。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/84980.html
摘要:使用一個(gè)事件驅(qū)動(dòng)的非阻塞式的模型,讓它輕量而高效。也就是說(shuō)提供了用編寫(xiě)服務(wù)器的可能性,這種服務(wù)器具有令人難以置信的性能。正如官方聲明所說(shuō)是一個(gè)使用與瀏覽器相同引擎的運(yùn)行時(shí)。這意味著有兩個(gè)發(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ù)庫(kù)的查詢(xún)語(yǔ)言。另一方面,數(shù)據(jù)庫(kù)在最近十年變得相當(dāng)流行。大多數(shù)數(shù)據(jù)庫(kù)都有驅(qū)動(dòng)程序可以用,它們?cè)谏弦灿袔?kù)。我們已經(jīng)完成了在中使用數(shù)據(jù)庫(kù)所必須知道的所有基礎(chǔ)知識(shí)。 本文轉(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)一個(gè)本地身份驗(yàn)證策略。我們將有一個(gè)用戶(hù)頁(yè),一個(gè)備注頁(yè),和一些與身份驗(yàn)證相關(guān)的功能。下一步下一章主要涉及應(yīng)用程序的單元測(cè)試。你會(huì)學(xué)習(xí)單元測(cè)試測(cè)試金字塔測(cè)試替代等概念。 本文轉(zhuǎn)載自:眾成翻譯譯者:網(wǎng)絡(luò)埋伏紀(jì)事鏈接:http://www.zcfy.cc/article/1755原文:https://blog.risings...
摘要:狀態(tài)碼描述了請(qǐng)求的結(jié)果,它對(duì)錯(cuò)誤處理是必不可少的。響應(yīng)還沒(méi)完成成功這些狀態(tài)碼表示請(qǐng)求被接收并正確處理了。服務(wù)器錯(cuò)誤當(dāng)服務(wù)器由于某些錯(cuò)誤不能完成有效的請(qǐng)求時(shí),就發(fā)送這些狀態(tài)碼。 本文轉(zhuǎn)載自:眾成翻譯譯者:網(wǎng)絡(luò)埋伏紀(jì)事鏈接:http://www.zcfy.cc/article/1758原文:https://blog.risingstack.com/node-hero-node-js-req...
閱讀 1918·2021-09-23 11:21
閱讀 1704·2019-08-29 17:27
閱讀 1062·2019-08-29 17:03
閱讀 729·2019-08-29 15:07
閱讀 1927·2019-08-29 11:13
閱讀 2385·2019-08-26 12:14
閱讀 930·2019-08-26 11:52
閱讀 1736·2019-08-23 17:09