使用 Node 獲取 HTTP 請求的請求體數據

了解如何使用 Node 通過 HTTP 請求體提取發送的 JSON 數據。 這是如何提取請求體中作為 JSON 發送的數據。 如果你使用的是 Express,那就非常簡單:使用 body-parser Node 模塊。 例如,要獲取此請求的請求體: const axios = require('axios') axios.post('/todos', { todo: '購買牛奶', }) 這是對應的服務器端代碼: const bodyParser = require('body-parser') app.use( bodyParser.urlencoded({ extended: true, }) ) app.use(bodyParser.json()) app.post('/endpoint', (req, res) => { console.log(req.body.todo) }) 如果你沒有使用 Express,而是想在原生的 Node 中實現這個功能,當然需要更多的工作,因為 Express 為你抽象了很多內容。 關鍵的是,當你使用 http.createServer() 初始化 HTTP 服務器時,回調函數被調用時,服務器已經獲取了所有的 HTTP 標頭,但是沒有請求體。 在連接的回調中,傳遞的 request 對象是一個流。 因此,我們需要監聽請求體內容被處理的事件,並且它以塊的形式進行處理。 我們首先通過監聽流的 data 事件來獲取數據,在數據結束時,流的 end 事件被調用一次: const server = http.createServer((req, res) => { // 我們可以訪問 HTTP 標頭 req....

使用 Node.js、Express 和 MongoDB 构建 REST API

在本教程中,我们将使用 Node.js 和 Express 构建一个 REST API。 该 API 将提供一组 GET 和 POST 端点,以允许获取数据和发送数据。 我们将使用 MongoDB 数据库存储这些数据。 提示:在继续本教程之前,请确保在您的系统上安装了 MongoDB 数据库(或者您可以使用 Cloud MongoDB 数据库,如果您更喜欢这种方式) 我们的任务是创建一个旅行成本计算器应用程序。 想象一下去旅行,你有一个应用程序(可以是渐进式 Web 应用程序,也可以是移动应用程序),你可以在其中添加你的任何费用。汽油、酒店、食物、门票等等。 当旅行结束时,你可以将其归档,并成为历史的一部分-你可以导航并查看过去旅行花费了多少钱。 我们这里不会创建应用程序的前端,只有 API。 现在让我们详细分解这个问题,并将其转化为一系列 API 端点。 端点是我们将调用以进行操作的唯一 URL。 比如,添加一个新的带有其名称的旅行。 在开始时,没有存储的旅行,我们需要添加一个。我想象应用程序会要求用户提供名称,并有一个“创建旅行”按钮。当点击时,应用程序会将名称发送给 /trip 端点,并使用 POST HTTP 方法。 我们有了第一个端点,它将接受一个 name 属性。 POST /trip { name } 另一个端点将列出旅行,它是: GET /trips 默认情况下,它将按照创建日期排序返回旅行。 当用户想要添加新的费用时,应用程序会使用 POST 方法调用 /expense 端点,并提供描述费用的一些参数。 POST /expense { trip, date, amount, category, description } trip 是当前选择的旅行的 ID。...

使用Express发送响应

如何使用Express向客户端发送响应 在"Hello World"示例中,我们使用Response.send()方法发送一个简单的字符串作为响应,并关闭连接: (req, res) => res.send('Hello World!') 如果传入的是字符串,它会将Content-Type头设置为text/html。 如果传入的是对象或数组,它会将Content-Type头设置为application/json,并将该参数解析为JSON。 send()会自动设置Content-LengthHTTP响应头。 send()还会自动关闭连接。 使用end()发送空响应 发送没有任何内容的响应的另一种方法是使用Response.end()方法: res.end() 设置HTTP响应状态 使用Response.status(): res.status(404).end() 或者 res.status(404).send('File not found') sendStatus()是一个快捷方式: res.sendStatus(200) // === res.status(200).send('OK') res.sendStatus(403) // === res.status(403).send('Forbidden') res.sendStatus(404) // === res.status(404).send('Not Found') res.sendStatus(500) // === res.status(500).send('Internal Server Error')

使用Express進行文件傳送

Express提供了一個方便的方法來以附件的形式傳送文件: Response.download() 一旦使用這個方法來傳送文件的路由被用戶訪問,瀏覽器將提示用戶下載。 Response.download()方法允許您將文件附加到請求中,瀏覽器將把文件保存到磁盤,而不是在頁面上顯示出來。 app.get('/', (req, res) => res.download('./file.pdf')) 在應用程式的上下文中: const express = require('express') const app = express() app.get('/', (req, res) => res.download('./file.pdf')) app.listen(3000, () => console.log('伺服器準備就緒')) 您可以設定要以自訂文件名發送的文件: res.download('./file.pdf', 'user-facing-filename.pdf') 該方法提供了一個回調函數,您可以在文件傳送完成後執行代碼: res.download('./file.pdf', 'user-facing-filename.pdf', (err) => { if (err) { //處理錯誤 return } else { //執行其他操作 } })

使用Node.js和Express创建GraphQL服务器

這是一個關於如何使用Node.js和Express創建GraphQL服務器的簡單教程。 首先,創建一個新的Node.js項目,如果您還沒有設置一個的話: npm init --y 這個命令會創建我們使用npm所需的package.json文件。 安裝npm包express,graphql和express-graphql: npm install express graphql express-graphql 創建一個app.js文件,並開始初始化Express服務器: const express = require('express') const app = express() app.listen(3000, () => { console.log('App listening on port 3000') }) 現在我們添加express-graphql庫,它是一個中間件(middleware),我們將它應用於/graphql路由: const express = require('express') const graphqlHTTP = require('express-graphql') const app = express() app.use('/graphql', graphqlHTTP()) app.listen(3000, () => { console.log('App listening on port 3000') }) 我們需要傳遞一個對象,該對象包含了 schema 屬性,該屬性必須包含一個schema定義。 我們首先需要定義一個schema! 創建一個schema.js文件,然後在其中引入graphql庫,使用對象解構語法,我們獲取GraphQLSchema,GraphQLObjectType和GraphQLString這幾個對象: const graphql = require('graphql') const { GraphQLSchema, GraphQLObjectType, GraphQLString } = graphql 然後,我們通過初始化一個新的GraphQLSchema實例,並傳遞一個對象給它,該對象包含一個query屬性。該屬性是一個GraphQLObjectType對象的實例:...

創建一個帶有自簽名證書的 Express HTTPS 伺服器

如何為 Node.js 創建一個自簽名的 HTTPS 證書以在本地測試應用程式 要能夠從本地主機上提供 HTTPS 的網站,您需要創建一個自簽名證書。 自簽名證書足以建立一個安全的 HTTPS 連接,用於開發目的。儘管瀏覽器會報錯說該證書是自簽名的(並且因此不受信任)。 要創建證書,您必須在系統上安裝 OpenSSL。 您可能已經安裝了它,只需在終端中嘗試鍵入 openssl 即可。 如果沒有,在 Mac 上,您可以使用 brew install openssl(如果您使用的是 Homebrew)。否則,請在 Google 上搜索“如何在 ”。 安裝了 OpenSSL 之後,運行以下命令: openssl req -nodes -new -x509 -keyout server.key -out server.cert 您會被提示回答幾個問題。第一個是國家名稱: Generating a 1024 bit RSA private key ...........++++++ .........++++++ writing new private key to 'server.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request....

在 Express 中使用 express-validator 进行输入消毒

您已经了解了如何验证从外部世界进入 Express 应用程序的输入。 当您运行面向公众的服务器时,您会很快明白一件事:永远不要相信输入。 即使您使用客户端代码对输入进行了消毒和确保人们无法输入奇怪的东西,您仍然可能受到人们使用工具(甚至仅仅是浏览器开发工具)直接POST到您的端点的影响。 或者机器人尝试使用人类已知的每种攻击方式的组合。 您需要做的是对输入进行消毒。 您已经使用的express-validator包 也可以方便地用于执行消毒操作。 假设您有一个POST端点接受name、email和age参数: const express = require('express') const app = express() app.use(express.json()) app.post('/form', (req, res) => { const name = req.body.name const email = req.body.email const age = req.body.age }) 您可以使用以下方式进行验证: const express = require('express') const app = express() app.use(express.json()) app.post('/form', [ check('name').isLength({ min: 3 }), check('email').isEmail(), check('age').isNumeric() ], (req, res) => { const name = req.body.name const email = req.body.email const age = req....

在 Express 中處理 CORS

如何透過設定 CORS 允許跨網站請求 通常在瀏覽器中運行的 JavaScript 應用程式只能存取由同一個網域(原始網站)提供的 HTTP 資源。 從相同來源載入圖片、腳本/樣式表一直是可行的。使用 @font-face 載入網頁字型時也已經有預設的「同源政策」。而其他較不常見的事物(例如 WebGL 紋理和 Canvas API 中載入的 drawImage 資源)也是如此。 然而,對於從外部第三方伺服器發送的 XHR 和 Fetch 請求,預設會失敗。這就是除非第三方伺服器實現了一個允許建立連線以及請求資源並下載和使用的機制。 這個機制被稱為 CORS 跨來源資源共用。 需要 CORS 的一件非常重要的事情是 ES 模組,最近在現代瀏覽器中引入了。 如果您沒有在伺服器端設置允許提供第三方來源的 CORS 政策,請求將會失敗。 Fetch 範例: XHR 範例: 跨來源資源失敗的條件如下: 不同網域 不同子網域 不同埠號 不同協定 CORS 的目的是為了保護您的安全,防止惡意使用者利用您正在使用的 Web 平台。 如果您同時控制了伺服器和客戶端,您會知道雙方都是可信任的,因此有充分的理由允許資源共用。 如何做到這點呢? 答案取決於您使用的伺服器端堆棧。 瀏覽器支援 相當不錯(基本上所有,除了 IE<10): Express 範例 如果您正在使用 Node.js 和 Express 作為框架,請使用 CORS 中介軟體套件。 這裡有一個簡單的 Express Node.js 伺服器範例: const express = require('express') const app = express() app....

在 Express 中處理 HTTP 標頭

學習如何使用 Express 存取和更改 HTTP 標頭 從請求中存取 HTTP 標頭值 您可以使用 Request.headers 屬性存取所有的 HTTP 標頭: app.get('/', (req, res) => { console.log(req.headers) }) 使用 Request.header() 方法來存取個別請求標頭的值: app.get('/', (req, res) => { req.header('User-Agent') }) 更改回應的任何 HTTP 標頭值 您可以使用 Response.set() 來更改任何 HTTP 標頭的值: res.set('Content-Type', 'text/html') 然而,Content-Type 標頭有一個捷徑: res.type('.html') // => 'text/html' res.type('html') // => 'text/html' res.type('json') // => 'application/json' res.type('application/json') // => 'application/json' res.type('png') // => image/png:

在Express中如何獲取解析後的body和原始body

了解如何在Express中使用body-parser獲取解析後的body和原始body。 在我正在構建的某個應用程序中,我遇到了這個問題。 使用Express,我可以導入body-parser來將body解析為JSON: import bodyParser from 'body-parser' app.use(bodyParser.json()) 然而,為了與Stripe支付API集成,我需要將原始body(未解析)暴露給一個端點,但我無法找出如何在解析body為JSON的同時實現這一點。 下面的代碼可以解決這個問題: app.use(bodyParser.json({ verify: (req, res, buf) => { req.rawBody = buf } })) 現在可以通過req.rawBody獲取原始body,並且通過req.body獲取JSON解析後的數據。 從body-parser的GitHub上我發現,這將使每次請求的RAM使用量翻倍,但由於我需要這個功能,我別無選擇。 除非為我想處理的Stripe webhook創建一個不同的伺服器。