如何將回調轉換為async/await

我有一些使用回調函數的程式碼。不涉及太多實現細節,以下是要點: const uploadFile = (callback) => { // 上傳文件,然後將文件位置通過回調函數返回 callback(location) } uploadFile((location) => { // 執行後續操作 }) 如上所示,我調用uploadFile函數,當它完成所需操作後,就會調用該回調函數。 但是我希望在整個程式碼中都使用async/await,因此我決定在這裡使用async/await來替代回調函數。 這是我所做的:我將uploadFile函數的主體代碼用return new Promise()包裹起來,並在獲取到要返回的數據後調用resolve(): const uploadFile = () => { return new Promise((resolve, reject) => { // 上傳文件,然後通過回調函數返回文件位置 resolve(location) }) } const location = await uploadFile() 現在,我可以在第一層級中使用location數據,而不是它被包裹在回調函數中。 這有助於讓我的代碼更加整潔,並更好地理解它。 如果您有興趣,這是實際函數的完整代碼,您可以在其中看到此概念的具體示例: const uploadFile = (fileName, id, callback) => { const fileContent = fs.readFileSync(fileName) const params = { Bucket: process.env.AWS\_BUCKET\_NAME, Key: `file.jpg`, Body: fileContent } s3....

如何將密碼存儲在資料庫中

你不需要將密碼直接存儲在資料庫中。你需要存儲密碼的雜湊值,這是從密碼產生的一個字符串,但沒有辦法從雜湊值回推出原始的密碼值。 使用Node,安裝 bcrypt: npm install bcrypt 引入它,並設置salt回合值,稍後我們會使用它: const bcrypt = require('bcrypt') const saltRounds = 10 創建密碼雜湊值 使用下面的代碼創建密碼雜湊值: const hash = await bcrypt.hash('PASSWORD', saltRounds) 其中 PASSWORD 是實際的密碼字符串。 如果你更喜歡回調函數的方式: bcrypt.hash('PASSWORD', saltRounds, (err, hash) => { }) 然後你可以將 hash 值存儲在資料庫中。 驗證密碼雜湊值 要驗證密碼,需要使用 bcrypt.compare() 將其與存儲在資料庫中的雜湊值進行比較: const result = await bcrypt.compare('PASSWORD', hash) // result 是 true 或 false 使用回調函數的方式: bcrypt.compare('somePassword', hash, (err, result) => { // result 是 true 或 false })

如何將您的 S3 存儲桶設為公開

我之前寫過一篇關於如何上傳圖片至 S3 的文章。 在我準備好 S3 存儲桶,並且成功上傳了圖片並將 URL 存儲在數據庫後,我發現這些圖片無法被公開以只讀的方式訪問。 圖片雖然存在,但任何人都無法查看。 如果我試圖訪問它,只會看到類似下面這樣的錯誤信息: <Error> <Code>AccessDenied</Code> <Message>Access Denied</Message> <RequestId>E5FBYNEYEFNZH</RequestId> <HostId> iImqC8XkvmPP4/BJxNGDZrPrDr7us1u3UeZqH8prlv3dk69R9m7uOaaaZDvTLAtne2rLkRWZ4= </HostId> </Error> 我覺得可能是權限問題,所以首先我試圖編輯“阻止公共訪問”設置,將原有的阻止設置禁用: 但是這並沒有解決問題,圖片依然無法訪問。 於是,我嘗試在單個文件的權限設置中,將“Everyone (公共訪問)”設置為“只讀”: 這樣做對於單個文件是有效的。 因此,我前往一般存儲桶權限,那裡有一個相似的 ACL 權限面板,我試圖設置相同的設置。 我將“Everyone (公共訪問)”設置為“只讀”,但結果並不如預期。 雖然我明確地設置了公共訪問權限,但是人們仍然無法公開查看文件。 事實上,沒有通過點擊操作可以實現這一點。 我必須設置一個存儲桶策略,可以從存儲桶權限頁面進行設置,然後我添加了以下內容: { "Version": "2008-10-17", "Statement": [ { "Sid": "AllowPublicRead", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::YOURBUCKETNAME/*" } ] } 請將 YOURBUCKETNAME 修改為您的存儲桶名稱。 通過添加這一段內容,我成功讓它生效。添加後,您可以將“阻止公共訪問”設置如下: 這就是全部了。現在,我的文件(在這種情況下是圖片)可以公開訪問了。

如何將畫布打印為數據URL

數據URL是瀏覽器提供的一個有用功能。 我們可以使用圖像來嵌入在HTML本身中,而不是引用文件系統文件,像這樣: <img src="data:image/png;base64,iVBORw0KGgoAA…" /> 其中,垃圾部分是由看似隨機的字母和數字組成的,非常長。 我正在使用Canvas API動態生成圖像,並偶然發現了Canvas物件的toDataURL()方法: canvas.toDataURL() 我認為這對於在伺服器端生成圖像並在網頁中提供圖像時非常有用。 特別是在Node.js進程中,使用canvas npm套件我們可以初始化一個Canvas: const { createCanvas, loadImage } = require('canvas') const canvas = createCanvas(200, 200) const ctx = canvas.getContext('2d') 然後,我們可以繪製圖像,例如使用ctx.fillText('Hello, World!', 50, 100),並調用canvas.toDataURL()生成圖像的數據URL,並將其附加為HTML字符串: const imageHTML = '<img src="' + canvas.toDataURL() + '" />' 當然,您也可以在前端執行相同的操作,只是現在canvas物件是對您繪製所使用的<canvas> HTML元素的引用: const canvas = document.getElementById('canvas') //... const imageHTML = '<img src="' + canvas.toDataURL() + '" />'

如何將圖片轉換為資料 URI 字串

我在檔案系統中有一個圖片檔案,我想要使用資料 URI 格式將它放入 HTML 頁面中,以便將其嵌入到頁面本身中。 以下是我這樣做的方法: const imageData = fs.readFileSync(fileLocation, 'binary') const src = `data:${contentType};base64,${Buffer.from( imageData, 'binary' ).toString('base64')}` 在我的情況下,我只是從網路上下載圖片,所以我從回應標頭中取得了 contentType: const contentType = response.headers['content-type'] 最後,我可以在 img 標籤中使用 src,像這樣:<img src={src} />

如何強制在每個 Axios 請求中使用憑據

我使用 Axios 與一個設定了 JWT 權杖的 API 進行交互。 該 API 在 cookie 中返回該令牌,我很快發現我需要在 Axios 選項中設置 withCredentials: true: import axios from 'axios' axios.post(API\_SERVER + '/login', { email, password }, { withCredentials: true }) 否則,cookie 將不會被保存。 我還需要在我發出的每個其他請求中設置它,以將 JWT 權杖發送到服務器: axios.get(API\_SERVER + '/todos', { withCredentials: true }) 現在,對於少量請求,這是可行的,但對於許多請求,您可能希望使用一個通用的配置。 您可以使用 create() 方法來創建一個新的 Axios 實例,然後在您的請求中使用它: import axios from 'axios' const instance = axios.create({ withCredentials: true }) instance.get(API\_SERVER + '/todos') 通常還會添加一個 baseURL 屬性: import axios from 'axios' const instance = axios....

如何從 C 函數中返回一個字符串

了解如何從 C 函數中返回一個字符串 在我的一個 C 程序中,我需要在一個函數中返回一個字符串: xxxxx myName() { return "Flavio"; } 麻煩的是定義返回值的類型。 C 中的字符串是char元素的數組,所以我們實際上無法直接返回一個字符串,而需要返回指向字符串第一個元素的指針。 這就是為什麼我們需要使用const char*的原因: const char* myName() { return "Flavio"; } 下面是一個示例工作程序: #include <stdio.h> const char* myName() { return "Flavio"; } int main(void) { printf("%s", myName()); } 如果你想將結果賦值給一個變量,可以這樣調用函數: const char* name = myName(); 我們可以以以下方式編寫指針運算符*: const char * myName() const char *myName() 所有形式都是完全有效的。 請注意使用const,因為我從函數返回的是一個字符串文字,即以雙引號定義的字符串,它是一個常量。 請注意,在 C 中不能修改字符串文字。 還有一點要牢記的是,在 C 函數中不能返回定義為局部變量的字符串,因為變量在函數執行結束時會自動被銷毀(釋放),並且因此將不可用。如果你嘗試執行下面的代碼: #include <stdio.h> const char* myName() { char name[6] = "Flavio"; return name; } int main(void) { printf("%s", myName()); } 你會得到一個警告和一些亂碼,如下所示:...

如何從 DOM 元素中刪除類別

TL;DR: 使用 remove() 方法於 element.classList 當你有一個 DOM 元素的參考時,你可以使用 remove 方法來刪除一個類別: element.classList.remove('myclass') 你可以使用 add 方法將一個新的類別加入: element.classList.add('myclass') 實作細節:classList 不是一個陣列,而是一個 DOMTokenList 類型的集合。 你無法直接編輯 classList,因為它是一個唯讀屬性。然而,你可以使用它的方法來改變元素的類別。

如何從 DOM 元素中移除所有子元素

給定一個 DOM 元素,如何移除它的所有子元素呢? 給定一個 DOM 中的項目,使用 querySelector() 來識別它,像這樣: const item = document.querySelector('#itemId') 然後,要移除它的所有子元素,有幾種不同的解決方案。 最快的方法看起來是這樣的: item.innerHTML = '' 另一個建議的解法是創建一個循環,檢查是否定義了 firstChild 屬性(元素至少具有一個子元素),然後將其刪除: const item = document.querySelector('#itemId') while (item.firstChild) { item.removeChild(item.firstChild) } 當所有子元素都被移除時,循環結束。 根據我查看的大多數性能測試結果,第一種解法看起來是最快的解決方案。

如何從 JavaScript 物件中刪除屬性

有多種方法可以從 JavaScript 物件中刪除屬性。找出替代方案和建議的解決方法。 從物件中刪除屬性的語意正確的方式是使用 delete 關鍵字。 給定以下物件 const car = { color: 'blue', brand: 'Ford' } 您可以使用以下方式從物件中刪除屬性 delete car.brand 也可以這樣表達: delete car['brand'] delete car.brand delete newCar['brand'] 將屬性設置為 undefined 如果您需要以非常優化的方式執行此操作,例如在循環中對大量物件進行操作時,那麼另一個選擇是將屬性設置為 undefined。 由於 delete 的性質,它的性能比簡單地將屬性重新賦值為 undefined 要慢很多,超過 50 倍。 但是,請記住,該屬性並未從物件中刪除。它的值被清除,但如果您遍歷物件,它仍然存在: 使用 delete 仍然非常快速,只有在有非常好的理由時才應該考慮這種性能問題,否則最好具有更清晰的語意和功能。 在不改變物件的情況下刪除屬性 如果 mutability 是一個關注點,您可以通過從舊物件複製所有屬性(除去要移除的屬性)來創建一個完全新的物件: const car = { color: 'blue', brand: 'Ford' } const prop = 'color' const newCar = Object.keys(car).reduce((object, key) => { if (key !== prop) { object[key] = car[key] } return object }, {}) (參見 Object....