摘要:狀態碼描述了請求的結果,它對錯誤處理是必不可少的。響應還沒完成成功這些狀態碼表示請求被接收并正確處理了。服務器錯誤當服務器由于某些錯誤不能完成有效的請求時,就發送這些狀態碼。
本文轉載自:眾成翻譯
譯者:網絡埋伏紀事
鏈接:http://www.zcfy.cc/article/1758
原文:https://blog.risingstack.com/node-hero-node-js-request-module-tutorial/
在如下教程中,將學習 HTTP 協議的基礎知識,以及如何使用 Node.js 的 request 模塊從外部源獲取資源。
什么是 HTTP?HTTP 代表超文本傳輸協議(Hypertext Transfer Protocol)。HTTP 作為在客戶機-服務器計算模型中的請求-響應協議。
HTTP 狀態碼在深入與其它 API 的通訊之前,我們來回顧一下在此過程中會遇到的 HTTP 狀態碼。狀態碼描述了請求的結果,它對錯誤處理是必不可少的。
1xx - 響應還沒完成(Informational)
2xx - 成功:這些狀態碼表示請求被接收并正確處理了。最常見的成功響應碼是 200 OK、201 Created 和 204 No Content。
3xx - 重定向: 這組狀態碼表示要完成請求,客戶端必須要做一些額外的操作。最常見的重定向響應碼是 301 Moved Permanently、304 Not Modified。
4xx - 客戶端錯誤: 這類狀態碼被用在客戶端發送的請求出現了某種錯誤時。服務器響應通常會包含了對錯誤的解釋。最常見的客戶端錯誤碼是 400 Bad Request、401 Unauthorized、403 Forbidden、404 Not Found、409 Conflict。
5xx - 服務器錯誤: 當服務器由于某些錯誤不能完成有效的請求時,就發送這些狀態碼。原因可能是代碼中的一個 bug,或者一些臨時或者永久性的無能。最常見的服務器錯誤狀態碼是 500 Internal Server Error、503 Service Unavailable。如果你想學習更多有關 HTTP 狀態碼的知識,可以在這里找到詳細的解釋。
向外部 API 發送請求在 Node 中,連接到外部 API 是很簡單的。只需要 require 核心 HTTP 模塊,然后開始發送請求即可。
當然,有更好的方式來調用外部端點。在 NPM 上可以找到很多讓這個過程更容易的模塊。例如,兩個最流行的模塊是 request 和 superagent。
這兩個模塊都有錯誤優先的回調接口,這就會導致一些問題(我打賭你已經聽說過回調地獄),但是幸運的是我們可以訪問封裝了 Promise 的版本。
使用 Node.js Request 模塊request-promise 模塊 的使用很簡單。從 NPM 安裝它之后,只需要 require 它:
const request = require("request-promise")
發送一個 GET 請求也那么簡單:
const options = { method: "GET", uri: "https://risingstack.com" } ? request(options) .then(function (response) { // Request was successful, use the response object at will }) .catch(function (err) { // Something bad happened, handle the error })
如果調用一個 JSON API,你可能會想讓 request-promise 自動解析響應。此時,只需要將其添加到 request 選項即可:
json: true
POST 請求的工作方式也類似:
const options = { method: "POST", uri: "https://risingstack.com/login", body: { foo: "bar" }, json: true // JSON stringifies the body automatically } ? request(options) .then(function (response) { // Handle the response }) .catch(function (err) { // Deal with the error })
要添加查詢字符串參數,只需要將 qs 屬性添加到 options 對象:
const options = { method: "GET", uri: "https://risingstack.com", qs: { limit: 10, skip: 20, sort: "asc" } }
這會讓請求 URL 變為:https://risingstack.com?limit=10&skip=20&sort=asc。
還可以用添加查詢參數同樣的方式來定義所有請求頭:
const options = { method: "GET", uri: "https://risingstack.com", headers: { "User-Agent": "Request-Promise", "Authorization": "Basic QWxhZGRpbjpPcGVuU2VzYW1l" } }錯誤處理
錯誤處理是對外部 API 發起請求的重要部分,因為不能確保會發生什么。除了客戶端錯誤以外,服務器會響應一個錯誤,或者就發送一個錯誤或者不一致格式的數據。在試著處理響應時,要記住這些。此外,對每次請求都使用 catch 也是一個避免外部服務讓服務器崩潰的好辦法。
綜合既然已經學過如何創建一個 Node.js HTTP 服務器,如何渲染 HTTP 頁面,如何從外部 API 獲取數據,那么現在就到了將它們放在一起的時候了!
在本例中,我們將創建一個小型 Express 應用程序,該程序基于城市名渲染當前的天氣條件。
要獲取 AccuWeather? API key,請訪問 Accuweather 開發者網站。
const express = require("express") const rp = require("request-promise") 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")) app.get("/:city", (req, res) => { rp({ uri: "http://apidev.accuweather.com/locations/v1/search", qs: { q: req.params.city, apiKey: "api-key" // Use your accuweather API key here }, json: true }) .then((data) => { res.render("index", data) }) .catch((err) => { console.log(err) res.render("error") }) }) app.listen(3000)
上面的示例做如下事情:
創建一個 Express 服務器
設置 handlebars 結構 - 對于 .hbs 文件,請參考 Node.js HTTP 教程
發送請求給外部 API
如果一切順利,就渲染頁面
否則,就顯示錯誤頁并記錄錯誤
下一步下章將學習如何正確組織 Node.js 項目。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/85140.html
摘要:基本上,測試金字塔描述你應該編寫單元測試集成測試和端到端測試。集成測試要比端到端測試多,單元測試甚至要更多一些。應用程序單元測試編寫單元測試,是為了看看給定的模塊單元是否工作。 本文轉載自:眾成翻譯譯者:網絡埋伏紀事鏈接:http://www.zcfy.cc/article/1754原文:https://blog.risingstack.com/node-hero-node-js-un...
摘要:本文轉載自眾成翻譯譯者網絡埋伏紀事鏈接原文本章我會指導你啟動一個簡單的服務器,并開始為請求服務。現在,我們開始創建第一個服務器我們將模塊,并將服務器綁定到端口來監聽。必須用如下方式啟動服務器總結本章學習了如何從頭開始創建第一個服務器。 本文轉載自:眾成翻譯譯者:網絡埋伏紀事鏈接:http://www.zcfy.cc/article/1750原文:https://blog.risings...
摘要:使用一個事件驅動的非阻塞式的模型,讓它輕量而高效。也就是說提供了用編寫服務器的可能性,這種服務器具有令人難以置信的性能。正如官方聲明所說是一個使用與瀏覽器相同引擎的運行時。這意味著有兩個發布版本穩定版和試驗版。 本文轉載自:眾成翻譯譯者:網絡埋伏紀事鏈接:http://www.zcfy.cc/article/1748原文:https://blog.risingstack.com/nod...
摘要:網站和使用同樣的注冊庫來顯示模塊以及查找模塊。使用在上一章開始使用中,當創建文件時,已經遇到了。此外,全局命名空間只包含公共模塊。通過引入作用域包來解決此問題。下一步異步編程下一章學習使用回調和實現異步編程的原理。 本文轉載自:眾成翻譯譯者:網絡埋伏紀事鏈接:http://www.zcfy.cc/article/1749原文:https://blog.risingstack.com/n...
摘要:本教程會學習如何正確組織一個項目的結構,從而在應用程序開始增長時避免混亂。項目結構的五個基本規則組織項目有不少可能的方式并且每種已知的方式都有其興衰。過去在,我們有機會創建各種規模的高效應用程序,也獲得了大量關于項目結構注意事項的見解。 本文轉載自:眾成翻譯譯者:網絡埋伏紀事鏈接:http://www.zcfy.cc/article/1756原文:https://blog.rising...
閱讀 2529·2021-09-24 10:29
閱讀 3810·2021-09-22 15:46
閱讀 2580·2021-09-04 16:41
閱讀 2986·2019-08-30 15:53
閱讀 1265·2019-08-30 14:24
閱讀 3058·2019-08-30 13:19
閱讀 2174·2019-08-29 14:17
閱讀 3526·2019-08-29 12:55