創建一個帶有自簽名證書的 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 中處理 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 中設置 Let's Encrypt

如何使用流行的免費解決方案 Let’s Encrypt 設置 HTTPS 如果你在自己的 VPS 上運行 Node.js 應用程式,你需要一個獲取 SSL 憑證的解決方案。 使用 Let’s Encrypt 和 Certbot 是當今的標準做法,它們是由 EFF(Electronic Frontier Foundation)提供的工具。EFF 是一家致力於保護隱私、自由言論和整個數位世界公民權利的領先非盈利組織。 我們將按照以下步驟進行: 安裝 Certbot 使用 Certbot 生成 SSL 憑證 允許 Express 提供靜態文件 確認域名 獲取憑證 設置續訂 安裝 Certbot 以下指令假設你使用 Ubuntu、Debian 或任何其他使用 apt-get 來管理套件的 Linux 發行版: sudo add-apt-repository ppa:certbot/certbot sudo apt-get update sudo apt-get install certbot 你也可以在 Mac 上安裝 Certbot 進行測試(需要 Homebrew): brew install certbot 然而,你需要將其連接到一個真實的域名,以便它有用。 使用 Certbot 生成 SSL 憑證 現在 Certbot 已安裝完成,你可以使用它來生成憑證。你必須以 root 身份運行此命令:...

在 Node 中使用文件夾操作

如何使用 Node 來操作文件夾 Node.js 的 fs 核心模組提供了很多方便的方法,可以用來處理文件夾。 驗證文件夾是否存在 使用 fs.access() 方法來檢查文件夾是否存在,並且 Node 是否有權限訪問。 創建新的文件夾 使用 fs.mkdir() 或 fs.mkdirSync() 方法來創建新的文件夾。 const fs = require('fs') const folderName = '/Users/flavio/test' try { if (!fs.existsSync(folderName)){ fs.mkdirSync(folderName) } } catch (err) { console.error(err) } 讀取文件夾內容 使用 fs.readdir() 或 fs.readdirSync 方法來讀取文件夾內容。 以下程式碼示範了如何讀取文件夾內容,包括文件和子文件夾,並返回它們的相對路徑。 const fs = require('fs') const path = require('path') const folderPath = '/Users/flavio' fs.readdirSync(folderPath) 你可以獲取完整的路徑: fs.readdirSync(folderPath).map(fileName => { return path.join(folderPath, fileName) } 你也可以過濾結果,只返回文件,排除文件夾: const isFile = fileName => { return fs....

在 Node.js 中使用 Axios 进行 HTTP 请求

Axios 是一个非常方便的 JavaScript 库,可以在 Node.js 中执行 HTTP 请求。 介绍 安装 Axios API GET 请求 在 GET 请求中添加参数 POST 请求 介绍 Axios 是一个非常受欢迎的 JavaScript 库,可以用来执行 HTTP 请求,适用于浏览器和 Node.js 平台。 它支持所有现代浏览器,包括对 IE8 及更高版本的支持。 它基于 Promise,并且可以使用 async/await 代码非常容易地执行 XHR 请求。 与原生的 Fetch API 相比,使用 Axios 具有许多优势: 支持旧版浏览器(Fetch 需要使用 polyfill) 可以中断请求 可以设置响应超时 内置 CSRF 保护 支持上传进度 执行自动的 JSON 数据转换 可用于 Node.js 安装 可以使用 npm 安装 Axios: npm install axios 或者使用 yarn 安装: yarn add axios 可以通过 unpkg....

在Node.js中解析JSON

如何從字符串解析JSON,以及如何在Node.js中讀取JSON文件 如果您有一個字符串作為一部分的JSON數據,最好的方法是使用JavaScript標準的JSON.parse方法來解析數據。自ECMAScript 5以來,這個方法已經提供給V8,這是Node.js所使用的JavaScript引擎。 示例: const data = '{ "name": "Flavio", "age": 35 }' try { const user = JSON.parse(data) } catch(err) { console.error(err) } 請注意,JSON.parse是同步的,所以JSON文件越大,你的程序執行時間也會越長,因為需要阻塞程序執行直到解析完成。 你可以通過將其放在一個promise和setTimeout調用中,以異步方式處理JSON。這確保解析在事件循環的下一次迭代中進行。 const parseJsonAsync = (jsonString) => { return new Promise(resolve => { setTimeout(() => { resolve(JSON.parse(jsonString)) }) }) } const data = '{ "name": "Flavio", "age": 35 }' parseJsonAsync(data).then(jsonData => console.log(jsonData)) 如果您的JSON數據是存在文件中的,您首先需要讀取它。 一種非常簡單的方法是使用require(): const data = require('./file.json') 由於你使用了.json擴展名,所以require()足夠聰明,會自動解析JSON數據到data對象中。 唯一的一個缺點是文件讀取是同步的方式進行的。此外,require()的結果會被緩存,所以如果您因為更新了文件而再次調用它,直到程序退出之前,您將無法獲取新的內容。 這個功能用於使用JSON文件作為應用程序配置的一部分,這是一個完全有效的使用場景。 您還可以手動讀取文件,使用fs.readFileSync: const fs = require('fs') const fileContents = fs....

在Node.js中遞迴獲取資料夾中的所有文件

你如何在Node.js中列出資料夾中的所有文件? 我有一個需求,需要遞迴地獲取資料夾中的所有文件。 我發現最好的方法是安裝glob庫: npm install glob 我想在content/post資料夾中查找所有的index.md文件,每個文件都在自己的目錄結構中,可能在多個子文件夾中: content/post/first/index.md content/post/second/index.md content/post/another/test/index.md 以下是我實現的方式: const glob = require('glob') const rootFolder = 'content/post' glob(rootFolder + '/\*\*/index.md', (err, files) => { if (err) { console.log('Error', err) } else { console.log(files) } })

在Node中从命令行接受输入

如何使用内置的readline Node模块使Node.js CLI程序具有交互性 如何使Node.js CLI程序具有交互性? Node自版本7开始提供了readline模块,可以实现从可读流(比如process.stdin流,它在Node程序执行期间是终端输入)逐行获取输入。 const readline = require('readline').createInterface({ input: process.stdin, output: process.stdout }) readline.question(`What's your name?`, (name) => { console.log(`Hi ${name}!`) readline.close() }) 这段代码会询问用户名,一旦文本被输入,并且用户按下回车键,我们会发送一条问候语。 question()方法会展示第一个参数(一个问题),并且等待用户输入。一旦按下回车键,它会调用回调函数。 在这个回调函数中,我们关闭了readline接口。 readline还提供了其他几个方法,我会让你自己在我上面提供的包文档中去查阅。 如果你需要输入密码,最好不要将其回显,而是显示为*符号。 最简单的方法是使用readline-sync包,它在API方面与上述方法非常相似,并且直接处理了这个问题。 一个更完整和抽象的解决方案则是由Inquirer.js包提供。 你可以使用npm install inquirer进行安装,然后你可以像这样重现上面的代码: const inquirer = require('inquirer') var questions = [{ type: 'input', name: 'name', message: "What's your name?", }] inquirer.prompt(questions).then(answers => { console.log(`Hi ${answers['name']}!`) }) Inquirer.js可以让你做很多事情,比如提问多个选择、使用单选按钮、确认等等。 值得知道所有的选择,尤其是Node提供的内置选择,但如果你计划将CLI输入推向一个新的层次,Inquirer.js是一个优秀的选择。

在不同的JavaScript庫中進行相同的POST API調用

我使用了一個很酷的應用程序Insomnia來測試API,它允許您對REST API或GraphQL API服務進行HTTP請求。 該應用程序具有一個很好的按鈕,可以生成代碼以從應用程序複製API請求,您可以在其中以可視化方式設計所有請求數據。 在內部,他們使用了httpsnippet,這是一個使用JavaScript編寫的多語言和庫的HTTP請求片段生成器。這是一個非常酷的項目。 無論如何,導出的代碼片段有幾個,我想展示不同庫中相同的API調用。 首先,這是API調用的描述。我向 api.randomservice.com 網站發送一個POST請求(這是我隨便想出的一個隨機URL)到 /dog 端點。 我向該端點發送一個帶有2個屬性的對象: { name: 'Roger', age: 8 } 作為JSON編碼。 我還傳遞了一個 content-type 以將內容設置為 application/json,並且還傳遞了一個 authorization 標頭,以使用通過API儀表板分配給我的Bearer令牌對請求進行身份驗證。 XHR 第一個代碼示例是使用XHR(可在瀏覽器中原生支持)和在Node.js中使用xmlhttprequest庫: const data = JSON.stringify({ name: 'Roger', age: 8 }); const xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener('readystatechange', function() { if (this.readyState === this.DONE) { console.log(this.responseText); } }); xhr.open('POST', 'https://api.randomservice.com/dog'); xhr.setRequestHeader('content-type', 'application/json'); xhr.setRequestHeader('authorization', 'Bearer 123abc456def'); xhr.send(data); Fetch API 然後,我們使用Fetch API進行相同的代碼片段,這也是另一個在瀏覽器中原生可用且可以在Node.js中使用node-fetch的API: fetch('https://api.randomservice.com/dog', { method: 'POST', headers: { 'content-type': 'application/json', authorization: 'Bearer 123abc456def' }, body: JSON....

在任意文件夾運行 Web 伺服器

您常常需要在系統中的特定文件夾中運行一個 Web 伺服器。 您沒有足夠時間來配置像 Apache 或 Nginx 這樣的正確的 Web 伺服器,因為這只是為了幾分鐘或測試您的應用。 那麼,該怎麼辦呢? 根據您喜歡的語言,您可能已經擁有所需的一切。 如果您使用 Node.js,並已經安裝了 npm,請運行以下命令: npm install -g http-server 然後在您想要透過伺服器公開的文件夾中運行 http-server。 默認情況下,它將在端口 8080 上啟動伺服器,但您可以使用 -p 標誌進行更改(運行 http-server --help 可查看更多選項)。 如果您使用 Python 並已安裝,只需運行以下命令: python -m SimpleHTTPServer 8080 (Python 2) 或者 python -m http.server 8080 (Python 3) 即可在本地端口 8080 上啟動一個本地伺服器。 如果您使用 PHP 並且運行一個現代版本,請運行以下命令: php -S localhost:8080