如何從 MIME 類型在 Node.js 中獲取文件擴展名

我通過表單傳送了一個文件,在使用 multipart/form-data 的表單之後,我在服務器端的 req.files 中得到了文件對象。 這給我提供了一些信息,例如路徑、名稱、大小、類型等: { logo: File { size: 121920, path: '/var/folders/tn/h8lfq1sj7c33c0p30qgkd3mw0000gn/T/upload_b9e85b7cf989482a1760d82b77fd555a', name: 'Screen Shot 2021-06-07 at 21.40.29.png', type: 'image/png', hash: null, lastModifiedDate: 2021-06-07T22:20:50.150Z, //... } } 請注意,臨時文件路徑沒有擴展名。 如果在服務器端使用文件名沒有問題。但是我想要更改它並使用自己的命名慣例,所以我只需要文件的擴展名。 要獲取它,你可以做兩件事:解析文件名, const path = require('path') path.extname(req.files.logo.name) //.png 這不需要任何第三方庫。 或者你可以使用 mime-types 套件並查看 MIME 類型: const mime = require('mime-types') mime.extension('text/plain') //txt mime.extension('image/png') //png

如何從 Node.js 上傳文件到 S3

我有一個簡單的使用案例。 我正在建立一個工作看板,現在是建立提交新工作職位的表單的時候了。 招聘人員可以輸入公司詳細資料、職位詳細資料和公司標誌圖片。 數據存儲在數據庫中,起初我試圖將標誌存儲在數據庫中,但過了一段時間,我意識到儘管在技術上是可行的,但在存儲二進制數據方面存在一些問題,而且任務需要花費太長的時間。因此,我決定將其上傳到 S3。 S3是AWS提供的一個出色的服務。由於我已經在其他方面使用AWS,添加S3存儲桶很容易。 所以我去創建了一個S3存儲桶。 我已經有了一個AWS帳戶。如果您沒有,請從這裡開始: https://aws.amazon.com。 一旦設置好帳戶,請在AWS中創建一個IAM用戶。登錄AWS,點擊頂部的您的名稱,然後點擊“我的安全憑證”。 在側邊欄中點擊“用戶”和“添加用戶”。啟用“編程訪問。” 通過頁面底部的按鈕(“下一步: 權限”)來轉到下一個屏幕。 點擊“直接附加現有策略”: 在過濾器中輸入“S3”以顯示S3策略 選擇AmazonS3FullAccess權限: 用戶創建完成後,您將獲得一對訪問密鑰ID和安全訪問密鑰。將其複製到您的項目中的.env文件中,或者存儲在某個地方以便以後使用。 接下來,進入S3並創建一個存儲桶。從S3首頁https://s3.console.aws.amazon.com點擊“創建存儲桶”按鈕。 設置一個名稱,選擇一個AWS區域,禁用“阻止所有公共訪問”(我們將在另一篇文章中討論權限),然後點擊頁面底部的“創建存儲桶”按鈕。 完成!現在是深入研究Node.js的時候了。我在Next.js中在API調用中使用這段代碼。 首先使用npm install aws-sdk安裝aws-sdk包。 如前所述,將您的AWS訪問代碼存儲在.env中: AWS_ACCESS_KEY_ID=<訪問密鑰> AWS_SECRET_ACCESS_KEY=<安全訪問密鑰> AWS_BUCKET_NAME=<存儲桶名稱> 在頂部添加 import AWS from 'aws-sdk' 然後使用以下代碼初始化s3對象: const s3 = new AWS.S3({ accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY }) 現在,當您想要上傳文件時,從存儲中加載它: const filename = '文件名' const fileContent = fs.readFileSync(fileName) const params = { Bucket: process.env.AWS_BUCKET_NAME, Key: `${filename}.jpg`, Body: fileContent } s3.upload(params, (err, data) => { if (err) { reject(err) } resolve(data....

如何從 Node.js 使用 Redis

在 Node.js 應用程式中,使用 Redis 伺服器最受歡迎的庫之一是 node-redis,它可以在 https://github.com/NodeRedis/node-redis 找到。 在您的專案中安裝該庫: npm install redis 提示:如果專案是全新的並且還沒有 package.json 檔案,請先執行 npm init -y。 連接到 Redis 實例 安裝完庫之後,使用以下程式碼在您的專案中引入它: const redis = require('redis') 或者 import redis from 'redis' 獲取 redis 物件之後,使用以下程式碼創建一個新的客戶端: const client = redis.createClient({ url: 'redis://YOUR REDIS INSTANCE URL' }) 然後使用以下程式碼連接到 Redis(在 async 函數中執行): await client.connect() 當您獲得了客戶端之後,就可以執行 Redis 可以做的所有操作。 要關閉連接,請調用: client.quit() 存儲和檢索鍵值 使用 set() 將鍵值對存儲到 Redis 中: client.set("<key>", "<value>") 例如: client.set("name", "Flavio") client.set("age", 37) 如果在乾淨的 Redis 伺服器上運行 redis-cli 中的 KEYS * 命令,您將看到這兩個鍵:...

如何從Node.js讀取環境變數

學會如何在Node.js程序中讀取和使用環境變數。 環境變數非常有用,因為我們可以避免在代碼中輸入API密鑰和其他敏感數據,並且將其錯誤地提交到GitHub中。 現代部署平台如Vercel和Netlify(以及其他平台)都有方法讓我們通過它們的界面添加環境變數。 Node.js的process核心模塊提供了env屬性,該屬性包含了在啟動進程時設置的所有環境變數。 下面是一個示例,訪問了NODE_ENV環境變數,該變數默認設置為development。 注意:process不需要“require”,它會自動可用 process.env.NODE\_ENV // "development" 將其設置為“production”之前,運行腳本將告訴Node這是一個生產環境。 同樣,您可以訪問所設置的任何自定義環境變數。 這裡為API_KEY和API_SECRET設置了2個變量。 API\_KEY=123123 API\_SECRET=456456 node app.js 我們可以通過以下方式在Node.js中獲取它們。 process.env.API\_KEY // "123123" process.env.API\_SECRET // "456456" 您可以將環境變數寫入.env文件(應將其添加到.gitignore中以防止提交到GitHub),然後運行以下命令。 npm install dotenv 在您的主要Node文件的開頭,添加以下代碼。 require('dotenv').config() 通過這種方式,您可以避免在node命令之前在命令行中列出環境變數,這些變數將自動被應用程序使用。 注意:某些工具,例如Next.js,會自動將在.env中定義的環境變數提供給程序,而不需要使用dotenv。

如何更新 Node.js

了解如何正確升級您所安裝的 Node.js 版本。 Node.js 可以在系統上以多種方式安裝,升級指南取決於您最初的安裝方式。 如果您使用官方包進行安裝 最簡單的安裝 Node.js 的方法是從 Node.js 網站 下載官方包。 官方包包含一個安裝程式,該程式將檢測現有的 Node.js 版本並覆蓋為新版本。 如果您使用 Homebrew(在 macOS 上)安裝 Node Homebrew 是在 Mac 上安裝 Node.js 的一種非常流行的方式。 如果您確實使用了 Homebrew,升級 Node 就像運行以下命令一樣簡單: brew update #確保 Homebrew 是最新版本 brew upgrade node Homebrew 可能會要求您升級 xCode 版本以編譯包。 如果您使用 nvm nvm 是運行 Node 的一種流行方式。它允許您輕鬆切換 Node 版本,安裝新版本來嘗試並在出現問題時輕鬆回滾,例如。 它還非常有用,可使用舊版 Node 測試您的代碼。 使用 nvm 時,可以通過輸入 nvm current 來檢查當前運行的版本,這與 node -v 給出的結果相同。 要列出所有已安裝的版本,運行 nvm ls。 您可以使用 nvm install <VERSION> 安裝新的 Node 發行版(或任何舊的 Node 發行版),例如:...

如何檢查 JavaScript 物件

瞭解 JavaScript 提供的檢查變數內容的方法(或其他類型的值)。 JavaScript 提供了許多方法來檢查變數的內容。特別是,讓我們找出如何輸出物件的內容。 控制台 API console.log console.dir JSON.stringify() toSource() 使用迴圈迭代屬性 如何在 Node.js 中檢查 假設我們有這個 car 物件,但是我們不知道它的內容,並且我們想要檢查它: const car = { color: 'black', manufacturer: 'Ford', model: 'Fiesta' } 控制台 API 使用控制台 API,您可以將任何物件輸出到控制台。這將適用於任何瀏覽器。 console.log console.log(car) console.dir console.dir(car) 與以下方式效果相同: console.log('%O', car) JSON.stringify() 這將以字串形式輸出物件: JSON.stringify(car) 透過增加這些參數: JSON.stringify(car, null, 2) 您可以使輸出更好閱讀。最後一個數字代表縮排的空格數: JSON.stringify() 的優點是可以在控制台之外運作,您可以在螢幕上輸出物件。或者,您可以將它與控制台 API 結合起來,在控制台中輸出: console.log(JSON.stringify(car, null, 2)) toSource() 類似於 JSON.stringify,toSource() 是大多數類型的方法,僅在 Firefox(以及基於 Firefox 的瀏覽器)中可用: 值得一提的是,由於它不是標準,只在 Firefox 上實現,所以 JSON.stringify 是一個更好的解決方案。 使用迴圈迭代屬性 for...in 迴圈很方便,它會列印物件的屬性:...

如何生成本地 SSL 證書

註:我在 macOS 上運行了這些命令。Linux 應該以相同的方式運行。我不能保證 Windows 的運行結果。 在專案的根目錄下運行以下命令: openssl req -x509 -newkey rsa:2048 -keyout keytmp.pem -out cert.pem -days 365 現在運行以下命令: openssl rsa -in keytmp.pem -out key.pem 現在你應該在資料夾中有 cert.pem 和 key.pem 兩個文件。 使用 Express/Node.js,你可以使用以下代碼加載證書和私鑰: const fs = require('fs') const https = require('https') const app = express() app.get('/', (req, res) => { res.send('Hello HTTPS!') }) https.createServer({ key: fs.readFileSync('key.pem'), cert: fs.readFileSync('cert.pem') }, app).listen(3000, () => { console.log('Listening...') }) 如果你使用的是 create-react-app,請將 package.json 文件中的 start 腳本更改為:...

如何移除所有的 node_modules 資料夾內容

通過刪除舊的 Node 模塊節省空間 我需要將一個充滿舊項目的資料夾轉移到一台新的電腦上,並在壓縮該資料夾後,我發現它的大小為8GB。對於僅包含文本文件的某些程式項目來說,這有點太大了。 這些都是 JavaScript 項目,並且每個項目都包含一個名為 node_modules 的資料夾。 這些資料夾完全是不必要的,因為我始終可以在項目中運行 npm install 重新生成它們,而且大部分我在那個資料夾中的項目都是我永遠不會再使用的舊東西。 所以我決定刪除所有的 node_modules 資料夾,但是他們太多了。所以我進入了父資料夾,我將其稱為 dev,然後在 ZSH 終端中(這是 macOS Catalina 默認的 shell)運行了以下命令: find . -name "node_modules" -type d -prune -exec rm -rf '{}' + 這將我的資料夾大小從8GB減少到了2GB。對於一行命令來說,效果還不錯。 我在這篇博客上找到了這個命令,你可以在那裡找到更多對命令細節的解釋。

如何解决 ES 模块范围內的“__dirname 未定义”的錯誤

下面是如何解决“__dirname 未定义在 ES 模块范围內”的錯誤的方法。 在使用 ES 模块時,无法使用 __dirname。 在 Node 脚本中,可以使用 __dirname 获取 当前 JavaScript 文件所在文件夹的路径,许多 Node.js 项目中都会使用它。 但是,如果在 ES 模块中使用它,你将遇到“__dirname 在 ES 模块范围內未定义”的錯誤。 在这种情况下,你可以做什么呢? 我通过使用在 Node.js GitHub 问题页面中找到的解决方案来解决此问题。 首先,你需要导入 Node.js 的 path 模块 和 url 模块中的 fileURLToPath 函数: import path from 'path'; import { fileURLToPath } from 'url'; 然后,你可以按照以下方式复制 __dirname 的功能: const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); 顺便一提,这也复制了 __filename,它返回正在执行的代码的文件名。 现在,你可以像往常一样使用 __dirname: console.log(__dirname)

如何解決 JavaScript 中的「is not a function」錯誤

我在寫 JavaScript 時不加分號。 而這個我真的很喜歡。在我看來,這樣子語言更加清晰。 你可能不喜歡這樣,這是可以理解的。但這就是事實。 分號是可選的,我們沒有必要加上它們。 然而,有時我們必須要特別注意。尤其在 Node.js 中,我們使用 require() 來載入外部模組和檔案。 這可能會導致某些情況下出現以下錯誤: TypeError: require(...) is not a function 這是一個奇怪的錯誤,對吧? 讓我們看看我是如何遇到這個錯誤的。 我載入了一個函式庫,然後我要在根層級執行一些程式碼,並且我建立了一個立即調用的異步函式: const fs = require('fs') (async () => { //... })() JS 在 require() 後面看不到分號,然後我們以 ( 開頭一行,JS 以為我們要執行一個函式。 它將 require('fs') 視為函式的名稱,如果該模組導出返回了一個函式,這實際上是可以正常工作的。 但實際上並不是這樣,所以我們得到了 ...is not a function 的錯誤。 我們該如何解決這個問題呢? 我們需要加上一個分號。隨便哪都可以。 這個方法能有效解決問題: const fs = require('fs') ;(async () => { //... })() 另外這個方法也能正常工作: const fs = require('fs'); (async () => { //... })() 這是我們必須付出的一點小代價,為了避免到處使用分號。...