如何使用Node.js將圖像上傳至S3

在本篇文章中,我將分享如何使用Amazon Web Services提供的優秀雲端檔案存儲解決方案AWS S3來上傳圖像。 首先,安裝aws-sdk庫: npm install aws-sdk 在你的程式碼頂部導入它,以便在要添加文件上傳至S3功能的文件中使用它: import AWS from 'aws-sdk' 接下來,使用SDK來創建S3物件實例,並將其指派給s3變數: const s3 = new AWS.S3({ accessKeyId: process.env.AWS_S3_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_S3_SECRET_ACCESS_KEY, }) 請注意,我在這裡使用了兩個環境變數AWS_S3_ACCESS_KEY_ID和AWS_S3_SECRET_ACCESS_KEY。 現在進行一些"管理工作"。你需要在AWS上創建一個具有AWSCloudFormationFullAccess和AmazonS3FullAccess權限的具有程序化訪問權限的IAM設定文件,以及一個該使用者可以訪問的S3存儲桶。 我不會在這裡涵蓋這個方面,因為你可以找到大量關於這方面的文章和文檔。我只會提到你需要的JavaScript代碼。 現在,你需要一個圖像blob來上傳。 你可以使用如下的URL: const imageURL = 'https://url-to-image.jpg' const res = await fetch(imageURL) const blob = await res.buffer() 或者,你可以從表單的圖像字段上傳的多部分表單中獲取圖像: const imagePath = req.files[0].path const blob = fs.readFileSync(imagePath) 最後,調用s3.upload()方法,並調用其.promise()方法,以便你可以使用await等待它完成以獲取上傳的文件對象: const uploadedImage = await s3.upload({ Bucket: process.env.AWS_S3_BUCKET_NAME, Key: req.files[0].originalFilename, Body: blob, }).promise() AWS_S3_BUCKET_NAME是S3存儲桶的名稱,另一個環境變數。 最後,你可以通過引用Location屬性來獲取上傳的圖像在S3上的URL: uploadedImage.Location 你必須確保你將S3存儲桶設置為公開,以便可以訪問該圖像的URL。

如何使用Node.js寫入CSV檔案

使用Node.js將數組數據寫入CSV文件的快速教程 你可以使用 objects-to-csv 這個優秀的庫,快速將數組對象寫入CSV文件。 當然還有其他許多庫可供選擇。我在一個自己的項目中發現了這個庫的實用性,因此寫了這個小教程。 如果你需要更注重性能的應用程序,可以使用基於stream的庫,例如 fast-csv。 首先安裝它: npm install objects-to-csv 然後在你的Node.js代碼中引入它: const ObjectsToCsv = require('objects-to-csv') 當你有一個準備寫入CSV的對象數組時,初始化一個新的ObjectsToCsv對象實例: const csv = new ObjectsToCsv(list) 然後調用 csv.toDisk(),並傳入你要寫入的文件(相對於你的應用程序的基本路徑): await csv.toDisk('./list.csv') 這是一個基於Promise的API,我使用了await,所以你需要在一個async函數內調用這個API。 CSV中的列名自動從對象的屬性名中推斷出來。 請注意,這個命令會覆蓋文件中現有的內容。如果要追加到該文件,請傳遞一個帶有append屬性設置為true的第二個對象: await csv.toDisk('./list.csv', { append: true })

如何使用Node.js獲取文件的最後更新日期

了解如何使用Node.js檢索文件的最後更新日期 在Node.js中,所有與文件相關的功能都由fs模塊提供。這個模塊暴露了一個名為statSync()的方法,可以同步獲取文件的詳細信息。 通過傳入文件路徑(相對於文件位置或絕對路徑),調用該方法將返回一個包含mtime屬性的對象。 mtime是一個Date對象實例,包含了文件的最後修改日期。 const fs = require('fs') const getFileUpdatedDate = (path) => { const stats = fs.statSync(path) return stats.mtime } 如果需要,請查看JavScript日期指南以了解更多關於如何處理日期對象的信息。

如何使用nodemailer發送電子郵件

以下是使用nodemailer發送電子郵件的方法。 首先安裝nodemailer: npm install nodemailer 然後在您的Node腳本或應用程序中導入它: import nodemailer from 'nodemailer' 初始化一個傳輸器對象,稍後將使用它來發送電子郵件: const transporter = nodemailer.createTransport({ host: 'smtp.yoursmtpserver.com', port: 465, secure: true, auth: { user: 'smtp_user', pass: 'smtp_pass', }, }) 注意:您需要用真實的SMTP服務器憑據填充這些值。 現在,創建一個options對象,其中包含您要發送的電子郵件的詳細信息: const options = { from: '[[email protected]](/cdn-cgi/l/email-protection)', to: '[[email protected]](/cdn-cgi/l/email-protection)', subject: 'Hi!', html: `<p>Hello</>`, } 最後,在之前創建的transporter對象上調用sendMail()方法,傳遞options和一個回調函數,當完成時將會執行該回調函數: transporter.sendMail(options, (err, info) => { if (err) { console.log(err) } else { console.log('郵件已發送') } }) 這也可以使用基於Promise的語法: const info = await transporter.sendMail(options) 完整代碼: import nodemailer from 'nodemailer' const sendEmail = () => { const transporter = nodemailer....

如何使用npm安裝的套件

當你使用npm將一個套件安裝到node_modules資料夾中,或者全域安裝時,你該如何在你的Node程式碼中使用它呢? 假設你使用下列命令安裝了一個常用的JavaScript實用程式庫lodash: npm install lodash 這會將套件安裝到本地的node_modules資料夾中。 要使用它,在你的程式碼中只需要用require將它引入即可: const _ = require('lodash') 那如果你安裝的套件是可執行的呢? 在這種情況下,它會將可執行檔放在node_modules/.bin/資料夾中。 一個簡單的示例是cowsay,你可以在 cowsay 找到它。 cowsay提供了一個命令列程式,可以讓一頭牛說出你指定的話(還有其他動物的選項 🦊)。 當你使用npm install cowsay安裝這個套件時,它會將自己和一些相依性安裝到node_modules資料夾中: 裡面還有一個隱藏的 .bin 資料夾,其中包含指向cowsay可執行檔的符號連結: 那要如何執行這些可執行檔呢? 你當然可以輸入 ./node_modules/.bin/cowsay 來執行它,這是可行的,但是npx是一個更好的選擇。它是自從npm 5.2版本開始包含的工具,你只需要執行: npx cowsay npx 將能找到套件的位置,並執行它。

如何使用Phaser.js創建平台遊戲

在這個教程中,我將使用Phaser.js創建一個平台遊戲。 玩家可以使用左/右箭頭鍵移動,使用上箭頭鍵跳躍。目標是收集遊戲中的所有星星: 當玩家收集到所有星星時,我們將在頂部顯示“遊戲結束”,然後沒有其他操作。 雖然這非常簡單,但這是開始一個非常有趣的遊戲的開始,並且這也是展示Phaser以及JavaScript作為遊戲創作編程語言的絕佳方式。 設置專案 創建一個空文件夾,然後運行以下命令: npm init -y 這將初始化一個最小的’package.json’文件。 然後運行以下命令: npm install phaser 如果尚未安裝Parcel,請運行以下命令: npm install -g parcel-bundler 現在創建一個’app.js’文件,然後運行: parcel watch app.js 這將告訴Parcel在’dist/app.js’文件中構建我們的遊戲。 創建一個’index.html’文件,內容如下: <!DOCTYPE html> <html> <head> <script src="./dist/app.js"></script> </head> </html> 安裝’browser-sync’以運行包含此文件夾內容的HTTP服務器: npm install -g browser-sync 然後運行以下命令: browser-sync start --server --files "." 以上命令會觀察當前文件夾(以及所有子文件夾)中的所有文件的變化,並在端口3000上啟動一個Web服務器,自動打開一個瀏覽器窗口以連接到服務器。 每次更改文件,瀏覽器都會刷新,因此我們可以更快地進行開發。 太好了!我們可以開始了。 初始化Phaser 打開’app.js’並編寫以下代碼: import Phaser from 'phaser' 讓我們添加一個最小的配置: const config = { width: 800, height: 600, backgroundColor: 0xffffff, scene: { preload, create, update }, physics: { default: 'arcade', arcade: { gravity: { y: 300 }, debug: false } } } const game = new Phaser....

如何使用pm2來運行Node.js應用程式

這是一篇介紹如何在Linux上管理Node進程並透過GitHub Webhooks自動重啟它們的技術文章。 pm2是一個非常有用的Linux進程管理工具。 我在幾個項目中使用過它,現在我想告訴你如何使用它! 特別是我將使用它在DigitalOcean VPS上運行一個Node.js應用程式,並設置當我們將應用程式的更新推送到GitHub存儲庫時,pm2將會被觸發,從GitHub更新應用程式並重啟它。 聽起來很酷吧?那我們開始吧! 首先,在DigitalOcean上註冊並按照我的教程创建一個VPS。 重要提示:在DigitalOcean上使用NodeJS映象,它已經設置了pm2和node,而且除了root用戶外還有一個nodejs用戶。 當你的VPS運行起來之後,我們可以開始了。 確保你使用nodejs用戶進行ssh登錄。當以root身份登录時,只需運行su nodejs以使用該用戶。 你在VPS上運行的示例Node.js應用程式位於/var/www/html/文件夾中,它由hello.js文件組成。 應用程式的部署/運行已經通過pm2程序進行管理,它是一個守護進程管理器。 你可以使用pm2 list命令來查看現在正在運行的所有應用程序: 如果你對應用程式做任何更改,這些更改將在重新啟動應用程式之前不會生效: pm2 restart hello 你可以停止正在運行的應用程式: pm2 stop hello 如果你嘗試重新加載頁面,這將在瀏覽器中產生一個錯誤: 你可以運行: pm2 start hello 將應用程式重新啟動。 pm2的好處是,當系統重新啟動時,它會自動重新運行應用程序。 現在你已經看到了內置的Hello World的運行方式,讓我們部署另一個應用程式。 讓我們停止當前的示例應用程式: pm2 stop hello 並在/var/www/html中創建一個名為test的文件夾: mkdir test 進入該文件夾: cd test 運行以下命令: npm init -y 然後安裝Express: npm install express 現在運行nano app.js並添加以下代碼: const express = require("express") const app = express() app.get("/", (req, res) => res.send("Hello World!")) app.listen(3000, () => console....

如何使用PostgreSQL列出當前數據庫中的表格

在PostgreSQL的psql工具內,或者使用SQL,可以快速列出當前數據庫中的表格。 要列出當前數據庫中的表格,可以在psql中運行\dt命令: 如果要執行SQL查詢,可以運行以下代碼: SELECT table\_name FROM information\_schema.tables WHERE table\_schema = 'public' ORDER BY table\_name;

如何使用Puppeteer進行截圖

當你建立了一個Puppeteer的page物件後: const page = await browser.newPage() 你可以使用page物件上的screenshot()方法將截圖儲存為screenshot.jpg: await page.screenshot({ path: 'screenshot.jpg' }) 如果要截取整個網頁,可以加入fullPage選項: await page.screenshot({ path: 'screenshot.jpg', fullPage: true, }) 你也可以參考我的完整Puppeteer教學

如何使用Python刪除所有舊推文

我不喜歡保留太多「歷史性」的推文,尤其是那些我發表的愚蠢言論。因此,我決定刪除它們。 為此,我從 Twitter 設定中請求了所有推文的存檔。取得存檔可能需要花上數天的時間。我的存檔日期可以追溯到 2015 年,盡管我從 2007 年起就使用 Twitter。也許我已在 2015 年刪除了先前的推文,但是我不記得了。 我得到了存檔,下載並解壓縮了該文件夾,然後執行以下命令: python -m venv .venv source .venv/bin/activate.fish python -m pip install delete-tweets 接著,我按照 https://github.com/koenrh/delete-tweets 上的說明來設置環境變數,以設置 Twitter 應用程式的金鑰,這是運行整個過程所必需的: export TWITTER_CONSUMER_KEY="your_consumer_key" export TWITTER_CONSUMER_SECRET="your_consumer_secret" export TWITTER_ACCESS_TOKEN="your_access_token" export TWITTER_ACCESS_TOKEN_SECRET="your_access_token_secret" 我使用了一個我已經擁有的 Twitter 應用程式的消費者和存取金鑰(現在 Twitter 有一個創建新應用程式的過程,所以如果你沒有現有的應用程式,你必須經過審核和批准後才能創建)。 提示:當以這種方式定義環境變數時,它們會被默認記錄在 shell 歷史中。為了避免這種情況,使用 Fish shell 時,可以運行 fish --private 以私密模式啟動 shell。 然後我運行了以下命令: delete-tweets --until 2021-01-01 tweet.js 這樣就可以刪除我在 2021 年之前發表的所有推文。這需要一段時間,但它確實起作用了。 從 Twitter 獲取存檔所花的時間比刪除推文更長,但最終我還是得到了一張空白的畫布。