您需要多少JavaScript知識才能使用Node?

如果您剛剛開始學習JavaScript,您需要多深入地了解這門語言呢? 作為初學者,在您對編程能力充滿信心之前確實很難達到這一點。 在學習編程的過程中,您可能會感到困惑,不知道JavaScript在哪裡結束,Node.js從哪裡開始,反之亦然。 在潛入Node.js之前,我建議您對主要的JavaScript概念有良好的掌握: 語法結構 表達式 類型 變量 函數 this 箭頭函數 迴圈 迴圈和作用域 數組 模板字面量 分號 嚴格模式 ECMAScript 6、2016、2017 掌握了這些概念,您就可以成為一名熟練的JavaScript開發人員,在瀏覽器和Node.js兩個環境中都能夠應對自如。 以下概念也是理解非同步編程的關鍵,而非同步編程是Node.js的一個基本部分: 非同步編程和回調函數 計時器 Promises Async和Await 閉包 事件循環

構建一個HTTP伺服器

如何使用Node.js構建一個HTTP伺服器 以下是我們在Node.js介紹中使用的HTTP網絡伺服器,作為Node的Hello World應用程式。 const http = require('http') const hostname = 'localhost' const port = 3000 const server = http.createServer((req, res) => { res.statusCode = 200 res.setHeader('Content-Type', 'text/plain') res.end('Hello World\n') }) server.listen(port, hostname, () => { console.log(`Server running at http://${hostname}:${port}/`) }) 讓我們簡單分析一下。我們導入了http模組。 我們使用這個模組來創建一個HTTP伺服器。 伺服器被設定為在指定的主機名localhost上,監聽3000端口。當伺服器準備就緒時,調用listen回調函數。 我們傳遞的回調函數是在每次收到請求時都會執行的函數。每當收到新的請求時,都會調用request事件,並提供兩個對象:一個請求(http.IncomingMessage對象)和一個響應(http.ServerResponse對象)。 request提供了請求的詳細信息。通過它,我們可以訪問請求標頭和請求數據。 response用於填充我們將返回給客戶端的數據。 在這個例子中,我們通過res.statusCode = 200將statusCode屬性設置為200,表示請求成功。 我們還設置了Content-Type標頭: res.setHeader('Content-Type', 'text/plain') 並且我們通過將內容作為end()方法的參數來關閉響應: res.end('Hello World\n')

為什麼你應該在下一個專案中使用Node.js?

在什麼情況下使用Node.js是一個好主意?為什麼選擇Node.js而不是其他解決方案?本文旨在回答這個問題。 在建立任何類型的軟件時,都有大量的Node.js替代方案。 為什麼Node.js是一個好選擇? 在本文中,我將告訴你一些使用它的好理由。 Node.js是JavaScript JavaScript可能是世界上最受歡迎的編程語言。 JavaScript是唯一一種可以運行在Web瀏覽器中的語言,這使得它比任何其他語言都具有獨特的優勢。 隨著React Native、Electron和類似的解決方案的崛起,它也是唯一一種可以用來創建網絡應用、前端和後端、手機應用、桌面應用的語言。 它非常通用,一旦你在某個領域掌握了JavaScript語言,你的技能可以很容易地轉移到另一個領域,你只需要學習環境的差異(例如,如何使用React Native而不是Electron,或者DOM)。 這是你在其他地方找不到的。 此外,JavaScript是一門非常出色和靈活的語言。 如果你已經因為在瀏覽器中工作而熟悉JavaScript,那麼選擇Node.js就是显而易见的。 Node.js是事件驅動和單線程的 這是什麼意思?簡單來說,它可以很好地處理大量的負載。 每個Node.js程序都可以處理大量的並發連接,由於其非阻塞的I/O特性,仍然非常快速。 這意味著你擁有一切必要的工具來構建一個非常高效的系統。 Node.js非常受歡迎 這帶來了一些副作用。 首先,你會發現在線上討論任何類型的問題時都能找到解決方案。社區非常龐大且樂於助人。 它很容易入門,並且有很多可以學習的資源。 其次,有一個庫可以解決任何問題。 npm庫中有大量可以隨時使用的庫,只需運行一個簡單的npm install命令即可。 由於其受歡迎程度,一個惡性循環形成:你最喜歡的API可能只提供一個官方的Node.js庫,而其他語言可能根本就不被考慮,只能使用非官方的軟件包(質量不一)。 你可以輕鬆部署Node.js應用 有些編程環境需要專用的設置,即使是簡單的項目也是如此,因為沒有人為它們建立生態系統。 Heroku以簡化Rails應用程序開發而聞名,如今在Node.js中我們也有其他可比擬的解決方案。 我考慮的是Zeit Now。 當我需要一個能夠輕鬆設置一個示例Node.js應用程序並與世界共享的場所時,我會想到Glitch(提示:它也可以運行私有應用程序)。

理解 process.nextTick()

Node.js的 process.nextTick 函数以特殊的方式与事件循环进行交互。 当你尝试理解 Node.js 事件循环 时,其中一个重要部分就是 process.nextTick()。 每次事件循环完成一次循环,我们称之为一次 tick。 当我们将一个函数传递给 process.nextTick() 时,我们指示引擎在当前操作结束后,在下一个事件循环 tick 开始之前调用该函数: process.nextTick(() => { // 做一些事情 }) 事件循环正在忙于处理当前函数的代码。 当此操作结束时,JS 引擎会运行在该操作期间传递给 nextTick 调用的所有函数。 这是我们告诉 JS 引擎以异步方式处理函数的一种方法(在当前函数之后),但尽快执行而不是将其排队。 调用 setTimeout(() => {}, 0) 会在下一个 tick 结束时执行函数,比使用 nextTick() 要晚得多,后者优先调用并在下一个 tick 开始之前执行。 在下一个事件循环迭代中,使用 nextTick() 可确保代码已经被执行。

用於從子文件夾中提供多個Node.js應用程序的簡單nginx反向代理

最近我在DigitalOcean上設置了一個VPS,以在同一域名下運行幾個不同的Node.js腳本。 現在,您無法使兩個不同的Node.js應用程序監聽同一個端口,因此必須使用反向代理。常用的方法是使用Nginx。 我將每個Node應用程序設置為在自己的子文件夾中運行,所以我需要編輯Nginx配置: sudo nano /etc/nginx/sites-available/default 配置文件原始內容如下: server { listen 80 default\_server; listen [::]:80 default\_server; root /var/www/html; index index.html index.htm index.nginx-debian.html; server\_name hellonode; location ^~ /assets/ { gzip\_static on; expires 12h; add\_header Cache-Control public; } location / { proxy\_http\_version 1.1; proxy\_cache\_bypass $http\_upgrade; proxy\_set\_header Upgrade $http\_upgrade; proxy\_set\_header Connection 'upgrade'; proxy\_set\_header Host $host; proxy\_set\_header X-Real-IP $remote\_addr; proxy\_set\_header X-Forwarded-For $proxy\_add\_x\_forwarded\_for; proxy\_set\_header X-Forwarded-Proto $scheme; proxy\_pass http://localhost:3000; } } 這個配置允許一個Node.js應用程序在端口3000上運行,並且是主要在/處提供服務的應用程序。 我希望在/myservice下運行一個應用程序,所以我創建了一個在端口3001上監聽的Node應用程序,並添加了以下配置: location /myservice { rewrite ^/myservice/(....

當請求失敗時,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:...

談論不同主題的寫作

我已經在這個博客上寫了很長一段時間了。在這段時間裡,我涵蓋了許多不同的主題。 回顧往事,我從一些隨機的 Web 開發主題開始,然後專注於 Go、React、Node.js、CSS、HTML、瀏覽器 APIs、Next.js、Vue.js、Svelte、數據庫、Python、Swift,甚至電子學和 C 語言。 有時候,當我有希望寫一些與我通常所寫的主題不同的內容時,我會考慮一下。 這是我的博客,它不是一本名為“Web 開發”或其他類似的出版物。 儘管如此,當你長時間寫關於一個主題時,即使是像我這樣涵蓋了廣泛範圍的主題,你也會開始覺得自己與讀者之間有一個“合約”。 如果我決定寫關於 X 的內容而讀者對此不感興趣,會發生什麼事呢?他們會停止閱讀或關注這個博客嗎?他們會取消訂閱郵件通訊嗎? 除非你完全偏離了主題,否則幾乎從不會有這種情況。 你讀到了上面的主題列表嗎?它們之間幾乎沒有什麼相關性,除了它們都與編程有關。但是一位 React 開發者對於 C 語言或 CSS 沒有興趣。 因此,廣泛的專業領域是編程,在這個領域下我可以寫關於任何事情。 如果我開始寫關於園藝、狗、或者徒步旅行之類的內容,那就不一樣了。 有時候我會談論商業方面的事情,或者內容的製作,但這些都是相關的。 我考慮過在旅行時寫一些類似“旅遊博客”的帖子,只是為了做些不同的事情。也許有一天我會寫,儘管我不想讓讀者困惑。還有 Google 啊哈哈。 對我來說,規則是寫我想寫的內容。每天寫一篇帖子是關鍵。否則我早就停下來了。如果有一天我想寫關於旅行、烹飪或其他任何事情的內容,我就會去寫。 有時候我寫一篇關於如何為數字遊牧在整個歐洲旅行期間設置我的面包車的帖子,說實話,關於這些主題我獲得了更多的回覆。也許只是因為在他們那個時代這有些不尋常。 我將來要做的一件事是開始寫關於 SwiftUI 和 iOS 開發的內容。我已經考慮了好幾個月了。其實,我想已經有幾年了。 但現在我覺得是合適的時候了。 過去,我決定寫一些我不是非常熱衷的主題,比如數據庫。我對數據庫有多少熱情呢?我開始寫了幾天後就停下來了。 但我想,我可以寫一些我對於 iOS 應用的想法,計劃階段,開發過程,上架 App Store,等等的內容,這可能是我的一部分讀者非常感興趣的內容。 也許他們也有一個 iOS 應用的想法,這可能會是他們開始的觸發點。 我是否對 Web 開發厭倦了?絕對不是。而且任何 iOS 應用也需要與 Web 或 API 相應的對應組件,所以這不意味著我會停止寫關於它的內容。 而且我喜歡 JavaScript。 我只是喜歡編程。用代碼創造事物。不管是 Web 應用、iOS 應用還是桌面應用,都無關緊要。 對我來說,改變一下我寫關於什麼的方式只是為了多元化並保持我的能量水平高。 對我來說一直都是這樣。我會工作在一個 Web 應用上,然後轉到 iOS 應用,然後再轉到 macOS 開發,然後再回到 Web 應用。...

跨域資源共享(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....

重新啟動 Node 進程,而不更改檔案

我有需要運行一個 Node 專案,如果出現某些原因失敗,可以再次運行它。 我想到使用 nodemon,它是當檔案發生變化時重新啟動 Node 進程的方式。 我以為它也會在進程崩潰時重新啟動,但事實並非如此。 因此,我找到了這個解決方案。 如果進程崩潰,我使用命令行在主要應用檔案上運行 touch 命令,這樣 nodemon 就會檢測到檔案的變化並重新啟動進程: nodemon -x 'node app.js || touch app.js' 簡單而有效。 當然,在真實的環境中,你會使用像 pm2 這樣的強大解決方案(請參考我的教程如何使用 pm2 運行 Node.js 應用程式),但這對於我在本機運行幾小時的需求來說是有效的。 更新:另一個選擇是使用 Forever https://www.npmjs.com/package/forever