如何在 Node.js 中啟用 ES 模組

如何在 Node.js 中啟用 import 語法? 現在許多教學文章都使用 import XXX from 'XXX'(ES 模組)語法,而非 const XXX = require('XXX')(CommonJS)語法。 如果你直接在你的 Node.js 應用程式中使用這種語法,會出現錯誤訊息如下: unexpected identifier.. 有一種解決方法是使用 Babel。如果你已經為你的專案設定了 Babel,這個問題應該已經可以解決了。 不過現在你不再需要使用 Babel,因為 Node 已經支援實驗性的 ES 模組,但是由於它是實驗性的,你必須進行三個步驟才能啟用它。 首先,安裝最新版本的 Node.js。它包含了最新且最好的功能。 其次,在你的 package.json 檔案中加入 "type": "module" 這一行。 第三,在執行 nodejs 時使用 --experimental-modules 參數: node --experimental-modules app.js 這樣你就應該可以正常運行了! 另外一種方法是不在 package.json 檔案中加入 "type": "module" 這一行,而是將你的 app.js(或其他檔案)重新命名為 app.mjs。 需要注意的是,現在 require() 語法將無法使用。 對於可能不支援這個參數的舊版 Node.js,我建議試試看 esm npm 模組。

如何在 Node.js 中清空文件夾

如何在 Node.js 腳本中刪除文件夾中的所有文件 我需要在 Node.js 腳本中刪除文件夾中的所有文件。 我尋找了最佳解決方案,結果發現可以使用 fs-extra 库。 先安裝它: npm install fs-extra 然后導入該庫: import fsExtra from 'fs-extra' 最後使用 emptyDirSync() 方法,如下所示: const folder = './public/images' fsExtra.emptyDirSync(folder)

如何在 Node.js 中處理檔案上傳

本文將教你如何使用 Node.js,特別是 Express,來處理檔案上傳。 首先,安裝 express-fileupload npm 模組: npm install express-fileupload 然後將它加入至中介軟體: import fileupload from 'express-fileupload' // 或者 const fileupload = require('express-fileupload') 在你建立了 Express 應用程式之後,加入以下程式碼: app.use( fileupload(), //... 這是必要的,否則伺服器將無法解析檔案上傳。 現在上傳的檔案將會在 req.files 中提供。如果你忘記加入這個中介軟體,req.files 會是 undefined。 以下是處理檔案的最小程式碼範例: app.post('/saveImage', (req, res) => { const image = req.files.myFile const path = __dirname + '/images/' + image.name image.mv(path, (error) => { if (error) { console.error(error) res.writeHead(500, { 'Content-Type': 'application/json' }) res.end(JSON.stringify({ status: 'error', message: error })) return } res....

如何在 Node.js 中創建空文件

發現如何在 Node.js 的文件系統文件夾中創建一個空文件 fs 內置模塊提供的 fs.openSync() 方法是最佳選擇。 它返回一個文件描述符: const fs = require('fs') const filePath = './.data/initialized' const fd = fs.openSync(filePath, 'w') w 標誌確保在文件不存在時創建文件,如果文件存在,則用新文件覆蓋它,覆蓋其內容。 使用 a 標誌可以避免覆蓋。如果文件不存在,仍然創建該文件。 如果不需要文件描述符,可以在 fs.closeSync() 調用中包裝該調用以關閉文件: const fs = require('fs') const filePath = './.data/initialized' fs.closeSync(fs.openSync(filePath, 'w'))

如何在 Node.js 的回調函數中使用 promises 和 await

大部分的 Node.js API 在還沒有 promises 的時候就已經建立了,在這些 API 中,使用了回調函數的解決方案。 一般的 Node.js API 使用方式如下: doSomething(param, (err, result) => { }) 這個也同樣適用於一些庫,例如 node-redis。當我在一個項目中使用它時,到了某個時候我真的需要把所有的回調函數都移除掉,因為我有太多層次的嵌套回調函數,這種情況下就會陷入所謂的 “回調地獄”。 另外,有時候必須避免使用回調函數,因為你需要從函數中返回函數調用的結果。如果這個結果是通過回調函數返回的,那麼想要獲取結果的唯一方法就是將它作為另一個函數的參數返回,進而持續進行回調函數的操作。 const myFunction = () => { doSomething(param, (err, result) => { return result //無法從 `myFunction` 中返回這個結果 }) } const myFunction = callback => { doSomething(param, (err, result) => { callback(result) //不行 }) } myFunction(result => { console.log(result) }) 但是,有一個簡單的解決方案,這也是由 Node.js 自身提供的。我們可以通過使用內置的 util 模塊中的 promisify 方法 “promisify” 一個不支援 promises 的函數(以及相應的 async/await 語法)。...

如何在 PHP 中使用 Composer 和 Packagist

Composer 是 PHP 的套件管理工具。 它可以讓您輕鬆地將套件安裝到您的專案中。 在您的電腦上安裝它(Linux/Mac 或 Windows),安裝完成後您應該可以在終端機上使用 composer 指令。 現在,在您的專案中可以運行 composer require <lib>,它將會被本地安裝。舉個例子,讓我們安裝 Carbon 套件,這個套件可以幫助我們在 PHP 中處理日期。 composer require nesbot/carbon 這會執行一些動作: 安裝完成後,您將在資料夾中找到一些新的東西,例如 composer.json 至列出依賴項的新配置: { "require": { "nesbot/carbon": "^2.58" } } 還有一個被用來 “鎖住” 套件版本的 composer.lock,以便在其他伺服器上可以複製完全相同的安裝,還有包含剛剛安裝的套件及其相依套件的 vendor 資料夾。 現在,在 index.php 檔案中,我們可以在頂部添加這段程式碼: <?php require 'vendor/autoload.php'; use Carbon\Carbon; 然後,我們就可以使用這個套件了! echo Carbon::now(); 看到了嗎?我們不需要手動從網上下載套件,然後在某個地方安裝它… 一切都快速、方便且有組織性。 require 'vendor/autoload.php'; 這行程式碼實現了自動加載。還記得我們之前談到的 require_once() 和 include_once() 嗎?這解決了所有的問題,我們不需要手動搜索要包含的檔案,只需要使用 use 關鍵字將套件導入我們的程式碼中。

如何在 PHP 中使用 Cookies

Cookies 是瀏覽器的一項功能。 當我們向瀏覽器發送一個響應時,我們可以設置一個 cookie,並且該 cookie 會通過瀏覽器在客戶端保存。 然後,瀏覽器發送的每個請求都會將 cookie 返回給我們。 我們可以使用 cookie 來做很多事情,它們主要用於在不需要登錄服務的情況下創建個性化體驗。 需要注意的是,cookie 是特定於域名的,所以我們只能讀取我們設置在應用程序當前域名上的 cookie,不能讀取其他應用程序的 cookie。 但是 JavaScript 可以讀取 cookie(除非它們是HttpOnly cookies,但這樣我們就要進入一個兔子洞了),所以 cookie 不應該存儲任何敏感信息。 我們可以使用 PHP 通過引用 $\_COOKIE 超全局變量來讀取 cookie 的值: if (isset($\_COOKIE['name'])) { $name = $\_COOKIE['name']; } setcookie() 函數允許您設置一個 cookie: setcookie('name', 'Flavio'); 我們可以添加第三個參數來指定 cookie 的過期時間。如果省略,則 cookie 在會話結束時(或瀏覽器關閉時)過期。 使用以下代碼使 cookie 在 7 天後過期: setcookie('name', 'Flavio', time() + 3600 \* 24 \* 7); 我們在 cookie 中只能存儲有限的數據量,而且用戶在清除瀏覽器數據時可以在客戶端清除 cookie。 同時,cookie 是特定於瀏覽器/設備的,所以我們可以在用戶的瀏覽器中設置一個 cookie,但如果他們更換了瀏覽器或設備,該 cookie 將不可用。...

如何在 PHP 中使用 HTTP 標頭

PHP 通過 header() 函數讓我們能夠設置響應的 HTTP 標頭。 HTTP 標頭 是一種向瀏覽器發送信息的方式。 我們可以將頁面設置為生成 500 內部服務器錯誤: <?php header('HTTP/1.1 500 Internal Server Error'); ?> 現在,如果你使用 瀏覽器開發者工具 打開頁面,你應該能夠看到狀態: 我們可以設置響應的 content/type: header('Content-Type: text/json'); 我們可以強制執行 301 重定向: header('HTTP/1.1 301 Moved Permanently'); header('Location: https://flaviocopes.com'); 我們可以使用標頭告訴瀏覽器“緩存此頁面”、“不要緩存此頁面”,以及更多其他操作!

如何在 React JSX 中進行迴圈

在 React 元件中如何做迴圈 假設你有一個 React 元件和一個你想要迴圈處理的 items 陣列,以列印出所有的 “items”。 以下是你可以進行的方法。 在返回的 JSX 中,添加一個 <ul> 標籤來建立一個項目的清單: return ( <ul> </ul> ) 在這個清單內,我們使用花括號 {} 添加一個 JavaScript 的片段,並在這個片段內呼叫 items.map() 來迭代處理項目。 我們將一個 回呼函數 傳遞給 map() 方法,該函數將在清單的每個項目上被調用。 在這個函數內,我們返回一個包含陣列內容的 <li> (清單項目),並設置 key 屬性為該項目在陣列中的索引。這是 React 所需的。 return ( <ul> {items.map((value, index) => { return <li key={index}>{value}</li> })} </ul> ) 你也可以使用隱含返回的簡寫形式: return ( <ul> {items.map((value, index) => <li key={index}>{value}</li>} </ul> )

如何在 React 中呈現 HTML

學習如何在 React 中呈現 HTML 字串,而不需要進行轉義。 我碰到了這個問題 - 我需要在 React 應用程式中新增一個 HTML 字串,該字串來自所見即所得編輯器,但是簡單地在 JSX 中加入 {myString} 卻導致 HTML 被轉義,因此 HTML 標籤會顯示給使用者看! 我找到了兩個解決方案。第一個是原生方案,第二個則需要使用一個函式庫。 第一個解決方案:使用 dangerouslySetInnerHTML 你可以在 HTML 元素上使用 dangerouslySetInnerHTML 屬性來添加 HTML 字串到其內容中: <div dangerouslySetInnerHTML={{ __html: props.house.description }}></div> 請記住這個屬性被稱為「危險」,有其原因。在這種情況下,HTML 不會被轉義,這可能會導致 XSS 安全問題。 但這個屬性也有其正確使用的場景。 第二個解決方案:使用第三方函式庫 有許多函式庫實現類似 dangerouslySetInnerHTML 的功能,並提供更簡單的使用方式。 其中一個函式庫是 react-html-parser。 在 GitHub 上查看該函式庫: https://github.com/wrakky/react-html-parser 警告:在撰寫本文時,該函式庫已經兩年沒有更新了,所以未來可能會出現問題。但這個函式庫在我的案例中是可以使用的。 該選擇哪一個? 你可以尋找其他類似的函式庫,但最終,我選擇使用了 dangerouslySetInnerHTML 的方式。 「危險」這個名稱提醒我注意正確地設置白名單,以允許使用者在 HTML 字串中輸入我允許的 HTML 標籤。