Node.js 指南(入門指南)

入門指南

安裝Node以後,讓咱們嘗試構建咱們的第一個Web服務器,建立名爲「app.js」的文件,並粘貼如下代碼:html

const http = require('http');

const hostname = '127.0.0.1';
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}/`);
});

以後,使用node app.js運行你的Web服務器,訪問http://localhost:3000,你將看到一條消息'Hello World'node

調試指南

本指南將幫助你入門調試Node.js應用程序和腳本。git

啓用Inspector

當使用--inspect開關啓動時,Node.js進程經過WebSockets監聽Inspector Protocol定義的診斷命令,默認狀況下主機和端口127.0.0.1:9229,還爲每一個進程分配了惟一的UUID(例如,0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e)。github

Inspector客戶端必須知道並指定要鏈接到WebSocket接口的主機地址、端口和UUID,完整的URL是ws://127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e,固然取決於實際的主機和端口以及實例的正確UUID。web

Inspector還包括一個HTTP端點,用於提供有關調試對象的元數據,包括其WebSocket URL,UUID和Chrome DevTools URL,經過向http://[host:port]/json/list發送HTTP請求來獲取此元數據,這將返回一個JSON對象,以下所示;使用webSocketDebuggerUrl屬性做爲URL直接鏈接到Inspector。chrome

{
  "description": "node.js instance",
  "devtoolsFrontendUrl": "chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e",
  "faviconUrl": "https://nodejs.org/static/favicon.ico",
  "id": "0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e",
  "title": "node",
  "type": "node",
  "url": "file://",
  "webSocketDebuggerUrl": "ws://127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e"
}

在沒有--inspect的狀況下啓動的Node.js進程也能夠經過SIGUSR1(在Linux和OS X上)發出信號來指示開始偵聽調試消息,從Node 7開始,這將激活舊版Debugger API,在Node 8及更高版本中,它將激活Inspector API。npm

安全影響

因爲調試器具備對Node.js執行環境的徹底訪問權限,所以可以鏈接到此端口的惡意行爲者能夠表明Node進程執行任意代碼,瞭解在公共和專用網絡上公開調試器端口的安全隱患很是重要。json

公開公共調試端口是不安全的

若是調試器綁定到公共IP地址或0.0.0.0,則任何能夠訪問你的IP地址的客戶端均可以無限制地鏈接到調試器,而且可以運行任意代碼。segmentfault

默認狀況下,node --inspect綁定到127.0.0.1,若是你打算容許外部鏈接到調試器,你須要明確提供公共IP地址或0.0.0.0等。這樣作可能會給你帶來潛在的重大安全威脅,咱們建議你確保適當的防火牆和訪問控制措施,以防止安全風險。api

有關如何安全地容許遠程調試器客戶端鏈接的一些建議,請參閱「啓用遠程調試方案」一節。

本地應用程序能夠徹底訪問inspector

即便將inspector端口綁定到127.0.0.1(默認值),計算機上本地運行的任何應用程序也將具備不受限制的訪問權限,這是爲了讓本地調試器可以方便地鏈接。

瀏覽器、WebSockets和同源策略

在Web瀏覽器中打開的網站能夠在瀏覽器安全模型下進行WebSocket和HTTP請求,須要初始HTTP鏈接才能得到惟一的調試器會話ID,同源策略阻止網站創建此HTTP鏈接,爲了防止DNS從新綁定攻擊的其餘安全性,Node.js會驗證鏈接的「主機」標頭是否精確指定了IP地址或localhostlocalhost6

這些安全策略不容許經過指定主機名來鏈接到遠程調試服務器,你能夠經過指定IP地址或使用ssh隧道來解決此限制,以下所述。

Inspector客戶端

一些商業和開源工具能夠鏈接到Node的Inspector,這些基本信息以下:

node-inspect

  • Node.js Foundation支持的CLI調試器,它使用Inspector協議
  • 一個與Node捆綁在一塊兒的版本,能夠與node inspect myscript.js一塊兒使用。
  • 最新版本也能夠獨立安裝(例如npm install -g node-inspect),並與node-inspect myscript.js一塊兒使用。

Chrome DevTools 55+

Visual Studio Code 1.10+

  • Debug面板中,點擊設置圖標以打開.vscode/launch.json,選擇「Node.js」進行初始設置。

Visual Studio 2017

  • 從菜單中選擇「Debug> Start Debugging」或按F5
  • 詳細說明

JetBrains WebStorm 2017.1+和其餘JetBrains IDE

  • 建立一個新的Node.js調試配置並點擊Debug,對於Node.js 7+,默認狀況下將使用--inspect,要禁用,請在IDE Registry中取消選中js.debugger.node.use.inspect

chrome-remote-interface

  • 用於簡化與Inspector Protocol端點的鏈接的庫。

命令行選項

下表列出了各類運行時標誌對調試的影響:

--inspect

  • 啓用inspector代理
  • 監聽默認地址和端口(127.0.0.1:9229)

--inspect=[host:port]

  • 啓用inspector代理
  • 綁定到地址或主機名,host(默認值:127.0.0.1)
  • 監聽端口,port(127.0.0.1:9229)

--inspect-brk

  • 啓用inspector代理
  • 監聽默認地址和端口(127.0.0.1:9229)
  • 在用戶代碼啓動前中斷

--inspect-brk=[host:port]

  • 啓用inspector代理
  • 綁定到地址或主機名,host(默認值:127.0.0.1)
  • 監聽端口,port(127.0.0.1:9229)
  • 在用戶代碼啓動前中斷

node inspect script.js

  • 生成子進程以在--inspect標誌下運行用戶腳本,並使用main進程運行CLI調試器。

node inspect --port=xxxx script.js

  • 生成子進程以在--inspect標誌下運行用戶腳本,並使用main進程運行CLI調試器。
  • 監聽端口,port(127.0.0.1:9229)

啓用遠程調試方案

咱們建議你永遠不要讓調試器在公共IP地址上監聽,若是你須要容許遠程調試鏈接,咱們建議使用ssh隧道,咱們提供如下示例僅用於說明目的,請在繼續操做以前瞭解容許遠程訪問特權服務的安全風險。

假設你在遠程計算機remote.example.com上運行Node,你但願可以進行調試,在該計算機上,你應該啓動node進程,而且inspector僅偵聽localhost(默認值)。

$ node --inspect server.js

如今,在要從中啓動調試客戶端鏈接的本地計算機上,能夠設置ssh隧道:

$ ssh -L 9221:localhost:9229 user@remote.example.com

這將啓動ssh隧道會話,其中與本地計算機上的端口9221的鏈接將轉發到remote.example.com上的端口9229,你如今能夠將調試器(如Chrome DevTools或Visual Studio Code)附加到localhost:9221,它應該可以調試,就好像Node.js應用程序在本地運行同樣。

遺留調試器

從Node 7.7.0開始,遺留調試器已被棄用,請改用--inspect和Inspector。

在版本7及更早版本中使用--debug--debug-brk開關啓動時,Node.js將偵聽TCP端口上已停用的V8調試協議定義的調試命令,默認狀況下爲5858,任何使用這個協議的調試器客戶端均可以鏈接並調試正在運行的進程;下面列出了幾個受歡迎的。

再也不維護或記錄V8調試協議。

內置調試器

  • 啓動node debug script_name.js以在Node的內置命令行調試器下啓動腳本,你的腳本在另外一個使用--debug-brk選項啓動的Node進程中啓動,初始Node進程運行_debugger.js腳本並鏈接到你的目標。

node-inspector

  • 使用Chrome DevTools調試Node.js應用程序,使用中間進程將Chromium中使用的Inspector協議轉換爲Node.js中使用的V8 Debugger協議。

上一篇:關於Node.js

下一篇:輕鬆分析Node.js應用程序

相關文章
相關標籤/搜索