當請求失敗時,Axios導致Node.js進程崩潰

我有一段使用axios進行網絡請求的代碼: axios({ method: 'post', url: 'https://...', data: JSON.stringify({ ... }) }) 但是我注意到當請求因某種原因失敗時,它會導致Node.js進程崩潰。 直到我添加了catch()的處理: axios({ method: 'post', url: 'https://...', data: JSON.stringify({ ... }) }).catch((err) => { console.error(err) })

简介:npm包管理器

快速指南到npm,这是Node.js成功的重要组成部分。截至2017年1月,npm注册表中已有超过35万个软件包,使它成为地球上最大的单一语言代码仓库,你可以确信几乎任何东西都可以找到一个软件包。 介绍npm 安装 如何使用npm 安装所有依赖项 安装单个软件包 更新软件包 版本控制 运行任务 介绍npm npm是Node.js的标准包管理器。 截至2017年1月,npm注册表中已有超过35万个软件包,使它成为地球上最大的单一语言代码仓库,你可以确信几乎任何东西都可以找到一个软件包。 它最初是用于下载和管理Node.js软件包的依赖项,但现在也被用于前端JavaScript。 npm有许多功能。 Yarn是npm的一个替代方案,请确保也了解一下它。 安装 安装Node.js时也会安装npm。请前往https://nodejs.org安装Node,如果你还没有在系统上安装过它。 如何使用npm npm管理项目的所有依赖项的下载。 安装所有依赖项 如果项目有一个packages.json文件,在命令行中运行以下命令即可安装项目所需的所有依赖项: npm install 它将在node_modules文件夹中安装所有依赖项,并在需要时创建该文件夹。 安装单个软件包 你也可以通过以下命令安装一个特定的软件包: npm install <package-name> 通常会在此命令中添加更多标志: --save 将软件包安装并添加到package.json文件的dependencies中(从 npm 5 开始,此为默认行为)。 --save-dev 将软件包安装并添加到package.json文件的devDependencies中。 两者的区别主要在于,devDependencies通常用于开发工具,比如测试库,而dependencies会在生产环境中与应用程序一起打包。 更新软件包 更新软件包也很容易,只需运行以下命令: npm update npm会检查所有软件包,找到满足版本控制条件的较新版本。 你也可以指定更新某个特定软件包: npm update <package-name> 版本控制 除了下载功能,npm还可以管理版本控制,你可以指定软件包的任何特定版本,或要求高于或低于所需版本。 许多时候,你会发现某个库只与另一个库的主要版本兼容。 或者,最新版本中的一个未修复的错误导致了问题。 指定库的显式版本还有助于使每个人都使用完全相同的软件包版本,直到更新package.json文件为止。 在所有这些情况下,版本控制都很有帮助,npm遵循语义版本控制(semver)标准。 运行任务 package.json文件支持一种格式,用于指定可以使用以下命令运行的命令行任务: npm run <task-name> 例如: { "scripts": { "start-dev": "node lib/server-development", "start": "node lib/server-production" }, } 很常见使用此功能来运行Webpack:...

經營部落格的利與弊

擁有一個部落格並非全是遊戲與樂趣。在你的旅程中可能會遇到很多困難。 認識到這一點是朝著正確方向邁出的第一步。 寫作的障礙 寫作障礙是一件事。我對此沒有一般性的建議,關於這個主題有許多更好的建議,比我能提供的還要多。 我解決不知道該寫什麼的方法是選擇我想要學習的主題,並公開地進行學習。就像我現在寫的這篇文章一樣,我正在學習一個全新的事物(Arduino和電子感應器),同時重新發現我在學校學習過的舊的電子學題目。 我在學習這個事物的同時拍攝視頻,並根據適合於部落格文章的主題撰寫部落格文章(不,我並不限於僅僅寫部落格,我還喜歡製作視頻)。 如果對我來說某個主題很無聊,我就不會寫關於它的文章,因為如果我在寫作時感到無聊,我寫出來的文章也會變得無聊。因此,我試著寫一些我感興趣和激動的事情。 冒充症候群 每個人遲早都會遭受這種我們稱之為冒充症候群的東西的困擾。也許你現在就有這種感覺,但你不知道它已經有了一個名字。 讓我描述一些你可能會在日常生活中遇到冒充症候群的情況。 你是一名開發人員,沒有計算機科學學位,但你覺得有計算機科學學位的人比你知識更加豐富,你也應該拿到一個計算機科學學位才能被稱為開發人員。 你在開發一個項目,你稱之為一個小的副專案,而不是一個真正的項目,因為——你知道——這只是一個簡單的應用程序。 你經常貶低自己,對自己的能力缺乏信心。 你認為其他開發人員比你知識更豐富。 你認為總有一天會有人發現你不值得擁有你的工作職位,因為你無法解決一本隨機書中的第423道編程面試測驗問題。 你認為你不屬於代碼寫手的圈子。 在部落格的情況下,你想開始寫部落格,但你害怕別人的意見,甚至認為自己無法為此做出任何新的貢獻,所以你甚至都沒有開始。 那麼這個問題的解決方法是什麼呢? 我不知道是否適用於你,但當我開始有這種感覺時,我試著站在學習者的角度來看待自己。我不是在教學,我是在公開學習。大多數時候是這樣的。 如果這還不夠,意識到你離開始時有多遠。回顧一下過去。有一天你甚至不知道如何啟動電腦。什麼是代碼甚至都不知道。你不知道你實際上可以創建程序並讓計算機按照你的意願運行。 看看你現在的樣子。你是你自己的最好版本,但你可以絕對肯定明天你會變得更好。你在進步。就像你的部落格文章一樣。 在公眾場合工作 在公眾場合工作可能會令人緊張。對我來說肯定是這樣。你真的不知道誰在關注你的工作,以及他們對此的真實看法。 你離不開有個不容忍的專家評判你的工作不重要。 也許一個庫的創建者正在看你關於該庫的教程,認為你沒有理解對。 但從另一方面看,通過在公開場合學習,你被迫成長。 提升遊戲水平。 你需要付出很多努力使你的工作在許多人眼中成為偉大的作品。 疲憊不堪 因你所做的所有事情感到不知所措是很容易的。思考新的內容,寫實際內容,寫客帖,努力推廣內容但不要過度推廣,並回答評論和反饋。 當然,這不僅局限於部落格。在我看來,這在YouTube領域更為嚴重。那裡,對我來說情況更糟。你把自己的臉和聲音展示給很多人,而不僅僅是在部落格文章中展示你的文字和圖片。 我避免疲憊的最好建議是採用一種極簡主義的方法,並選擇一個你非常感興趣的主題。 如果你寫關於自己充滿熱情的事情,你永遠不會缺乏寫作的材料。你的清單會有3英里長。 選擇一種極簡主義的方法意味著你必須減少任何非必要的事情。我的部落格上沒有評論。我需要更少關心人們的想法,這有助於減少我造成的壓力,但也有一個缺點,就是帶來了較少的社區感。 此外,我通常不在社交媒體或其他平台上推廣我寫的內容,除非這是一篇我真的希望能夠被看到的特殊文章,我也不經常在其他部落格上撰寫客帖。 一旦部落格建立起來,每天有相當比例的訪問量,這些活動就可以有所限制。所以隨著觀看次數的增加和許多人每天觀看你的工作所帶來的壓力增加,你可以獲得專注的好處。 降低期望 如果你保持期望值低,你就不會受到幻想的困擾。不要期待你的部落格會一夜之間取得成功。那是不可能的。就像YouTube頻道或播客一樣。這很難。除非有些幸運的人,也許。 這就是為什麼寫關於你激情所在的事情是有益的。如果你寫關於你一直想寫的事情,即使沒有人閱讀,你也會寫。那麼,如果成功終將來臨,你將會做好充分的準備。 惡意評論和負面反饋 互聯網可能是一個狂野的地方,我相信我不需要解釋這一點給你。當人們在線發表評論時,他們可能很刻薄。有時候。大多數時候他們不是這樣的。 我的部落格上沒有直接的評論功能,但我通過電子郵件和Twitter接收反饋。還有YouTube上的視頻。 而且每當我一篇博文在Reddit或Hacker News上被推薦,這兩個對我的內容來說很重要的網站,我都會很緊張地看評論。 這可能只是我敏感過高,但從我的博客上完全刪除評論讓我不必擔心某些內容無法引起人們的共鳴。 我寫了它,就是這樣,我已經盡我所能確保它符合我最好的判斷,然後我去做下一件事。 你的情況可能會有所不同。 忽略虛榮指標 我有一個令人難以置信的經歷,每天都有足夠的訪問量令我驚訝。 我在一天中的隨機時間點打開Google Analytics看到的訪問人數。然後我回到我正在做的事情。它有點上癮,但也沒有用。 那會影響我的一天嗎?不會。 那會改變我下一步要做什麼嗎?不會。 對於電子郵件訂閱者也是一樣。有多少人在列表上真的沒有關係。最重要的是人們對你的觀點產生共鳴並從你的工作中學到東西。 即使只有一小撮人。 其他都毫無用處。 經營部落格是孤獨的 經營部落格是孤獨的,就像寫一本書是孤獨的一樣。在你的秘密實驗室工作也是孤獨的。成為YouTuber是孤獨的。成為遠程自由職業者也是孤獨的。 這沒有太多解決辦法。 除了接受它,意識到一些人可能更喜歡孤獨。我絕對是個內向的人,在孤獨的環境中茁壯成長,連續數天都是在寂靜中度過。 這可能就是為什麼我喜歡寫部落格。 這需要時間 讓我們大聲說出來:這需要很多時間。你的部落格不可能會一夜之間取得成功。在你看到訪問量不斷增加之前,可能需要幾個月甚至幾年的時間。也許。如果你做得對。 這是殘酷的事實,但我認為這是必要的,因為我不希望你相信成功很容易實現,我想設定正確的期望。時間、堅持、每天出席。這就是任何活動取得任何形式的成功所需的。 這是個長期遊戲,但最終會給你帶來很多滿足感。

解析 JavaScript 事件

簡介 在瀏覽器中的 JavaScript 使用事件驅動的程式設計模型。 一切都是從遵循事件開始。 事件可能是 DOM 載入完成,或一個非同步請求完成取得資源,或是使用者點擊元素或滾動頁面,或是使用者在鍵盤上輸入等等。 有很多不同種類的事件。 事件處理程序 您可以使用事件處理程序來回應任何事件,它是在事件發生時呼叫的函式。 您可以為同一個事件註冊多個處理程序,當該事件發生時,它們都將被呼叫。 JavaScript 提供三種方式來註冊事件處理程序: 內聯事件處理程序 這種風格的事件處理程序很少被使用,因為它的限制,但在 JavaScript 的早期,這是唯一的方式: <a href="site.com" onclick="dosomething();">A link</a> DOM on-event 處理程序 這通常用於只有一個事件處理程序的對象上,因為在這種情況下無法添加多個處理程序: window.onload = () => { //window loaded } 在處理 XHR 請求時最常遇到: const xhr = new XMLHttpRequest() xhr.onreadystatechange = () => { //.. do something } 您可以使用 if ('onsomething' in window) {} 檢查是否已經為屬性指定了處理程序。 使用 addEventListener() 這是現代的方式。這種方法允許我們註冊所需數量的處理程序,並且這是最常見的方式: window.addEventListener('load', () => { //window loaded }) 注意,IE8 及更低版本不支援這種方式,而是使用自己的 attachEvent() API。如果需要支援較早的瀏覽器,請牢記這一點。...

解釋 JavaScript 閉包

輕鬆介紹閉包的主題,這是理解 JavaScript 函數如何運作的關鍵。 如果你曾經在 JavaScript 中寫過函數,你已經使用過閉包了。 這是一個需要理解的重要主題,會對你能做的事情產生影響。 當一個函數被執行時,它是在定義時的作用域中運行,而不是在執行時的狀態中運行。 作用域基本上是一組可見的變數。 一個函數記住了它的詞法作用域,它能夠訪問在父範圍中定義的變數。 簡而言之,一個函數能夠訪問一個完整的變數集合。 讓我馬上舉個例子來澄清這點。 const bark = dog => { const say = `${dog} barked!` ;(() => console.log(say))() } bark(`Roger`) 這將按預期將 Roger barked! 輸出到控制台。 如果你想返回這個動作呢: const prepareBark = dog => { const say = `${dog} barked!` return () => console.log(say) } const bark = prepareBark(`Roger`) bark() 這段代碼也會在控制台上輸出 Roger barked!。 讓我們舉一個最後的例子,它使用 prepareBark 預先設定兩隻不同的狗: const prepareBark = dog => { const say = `${dog} barked!...

資料模型

資料模型定義了如何給予資料一個結構,以及資料如何與其他資料相連接。 我們有許多不同類型的資料模型。它們可以分為兩個主要的類別:概念模型和邏輯模型。 最著名的概念模型是實體關係(Entity-Relationship)模型,也稱為 ER 模型。在設計階段,當您開始時最好使用此模型來組織資料,因為它最貼近我們思考的方式,並且不受任何特定實作的影響。 另一方面,邏輯模型更接近實作。 邏輯模型包括(包括但不限於): 關聯模型 階層模型 網狀模型 物件模型 從名稱就可以看出這些模型的實作方式:關聯模型使用表格,階層模型使用樹狀結構,網狀模型使用圖形,物件模型使用物件。 關聯模型是一個重要的邏輯模型,我們將在後面更詳細地介紹它,因為它是流行的關聯式資料庫(包括 PostgreSQL、MySQL、SQLite 和 SQL Server)的基礎。 概念模型和邏輯模型是兩個不同的工具。使用其中一個並不排除使用另一個。我們可以從概念模型開始,然後使用邏輯模型來實作它。

資訊系統、數據和資訊

現代世界完全以資訊和數據為中心。它們之間有什麼區別呢? 現代世界完全以資訊為中心。 無論大小,公司都可以從正確的資訊管理中獲得很大的價值,許多時候這就是他們的核心業務。 大多數公司在沒有適當管理他們營運所需的資訊的情況下無法存在,換言之,就是他們的資訊系統。 什麼是資訊系統? 資訊系統是我們用來收集、存儲、處理和傳遞組織中所需的資訊的一組程序和資源。 什麼是電腦資訊系統? 電腦資訊系統是使用計算機自動化資訊管理的資訊系統的子集。 在電腦資訊系統中,資訊被存儲為數據。 資訊和數據之間有什麼區別? 數據是單個的知識單元。它本身沒有固有價值。如果不了解更多信息,我們無法從中提取意思。 資訊是我們可以與數據相關聯,以能夠附加一個含義的東西。 讓我舉個例子。數字36是數據。知道36是我的年齡就是資訊。資訊表示數據代表我的年齡,這是資訊系統中的重要知識。

跨域資源共享(CORS)

介紹跨域資源共享,一種讓客戶端和服務器通信的方式,即使它們不在同一個域 在瀏覽器中運行的JavaScript應用程序通常只能訪問提供它的相同域名(源)上的HTTP資源。 加載圖片、腳本和樣式始終可以正常工作,但對另一個服務器的XHR和Fetch調用將失敗,除非該服務器實現了一種方法來允許該連接。 這種方法稱為CORS(Cross-Origin Resource Sharing,跨域資源共享)。 默認情況下,使用@font-face加載Web字體也需要跨域資源共享,還有其他一些不太常見的情況(例如WebGL紋理和Canvas API中加載的drawImage資源)。 在現代瀏覽器中,使用ES模塊(ES Modules)也需要CORS。 如果您沒有在服務器上設置允許提供第三方域的CORS策略,則請求將失敗。 Fetch示例: XHR示例: 如果跨域資源違反以下條件,則會失敗: 不同的域名 不同的子域名 不同的端口 不同的協議 這樣做是為了您的安全,以防止惡意用戶利用Web平台。 但是,如果您控制服務器和客戶端,則有足夠的理由讓它們互相通信。 如何實現呢? 這取決於您的服務器端堆棧。 瀏覽器支持 非常好(基本上所有瀏覽器,除了IE<10): 使用Express的示例 如果您使用Node.js和Express作為框架,請使用CORS中間件套件。 下面是一個簡單的Express Node.js服務器實現的例子: const express = require('express') const app = express() app.get('/without-cors', (req, res, next) => { res.json({ msg: '😞 沒有CORS,沒有派對!' }) }) const server = app.listen(3000, () => { console.log('已監聽端口 %s', server.address().port) }) 如果您從不同的源發起fetch請求並使用中間件函數來處理經過響應的端點請求處理程序,則可以使事情正常工作: const express = require('express') const cors = require('cors') const app = express() app....

運行 Python 程式

如何運行用 Python 編寫的程式 有幾種不同的方法可以運行 Python 程式。 特別是,您可以選擇使用互動提示,這裡您可以輸入 Python 程式碼並立即執行,或者將 Python 程式保存到檔案中並執行該檔案。 讓我們從互動提示開始。 如果您打開終端並輸入 python,您將看到如下的畫面: 這是 Python REPL (Read-Evaluate-Print-Loop)。 請注意 >>> 符號以及之後的光標。您可以在這裡鍵入任何的 Python 程式碼,然後按下 enter 鍵來執行它。 例如,試著使用以下程式碼定義一個新的變數: name = "Flavio" 然後使用 print() 函數來打印其值: print(name) 注意:在 REPL 中,您也可以只輸入 name,然後按下 enter 鍵,您將獲得其值。但在程式中,如果您這樣做,將不會看到任何輸出 - 您需要使用 print() 函數。 您在這裡編寫的任何 Python 程式碼都會立即執行。 輸入 quit() 以退出這個 Python REPL。 您可以使用 Python 自動安裝的 IDLE 應用程序來訪問相同的互動提示: 這可能對您來說更方便,因為您可以通過滑鼠更輕鬆地移動和複製/粘貼。 上述是 Python 默認提供的基本功能。然而,我建議安裝 IPython,這可能是您能找到的最好的命令行 REPL 應用程序。 使用以下命令安裝 IPython: pip install ipython 確保 pip 的執行檔位於您的路徑中,然後運行 ipython:...

過去並非你想像的那般過去

這是一個有趣的觀察。在播客中,我聽到一些人談到過去時都會這樣說: 「2008 年互聯網根本不存在。」 「2012 年沒有人使用 Facebook。」 「過去,眾所周知,在蘋果應用商店上取得成功要容易得多。」 「現在,你不能只是創建一個產品就能成功,你需要大量的市場營銷。」 以及其他類似的說法。 我稍微查找了一下,試圖找到能描述這個概念的術語,但沒有找到。也許 “歷史學家的謬誤” 接近: “歷史學家的謬誤是一種非正式的謬誤,當一個人假設過去的決策者以與隨後分析決策的人相同的視角和相同的信息來看待事件時,就會出現這個謬誤。” 但我不確定這是否完全相同。 當我聽到有人這樣說時,我會覺得這是不真實的。 在應用商店上銷售應用從來都不容易。對於今天而言,與 2012 年一樣困難。 從來沒有這樣一個時候,你可以僅通過建立一個產品而不進行市場營銷就獲得成功。 也許 2008 年的互聯網不如現在發達,但那時我們不知道。 到了 2030 年,這些人可能會四處說: 「我們怎麼能在 2021 年取得成功?當時沒有人上網。」 「在 2021 年,只需推出產品,而不需要任何市場營銷,就能輕易取得成功。」 「我希望我們在 2021 年能像 App Store 那樣有同樣的有機曝光。」 「在 2021 年,沒有人使用 TikTok。」