入门指南

安装Node之后,让我们尝试构建我们的第一个Web服务器,创建名为“app.js”的文件,并粘贴以下代码:

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.js应用程序和脚本。

启用Inspector

当使用--inspect开关启动时,Node.js进程通过WebSockets监听Inspector Protocol定义的诊断命令,默认情况下主机和端口127.0.0.1:9229,还为每个进程分配了唯一的UUID(例如,0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e)。

Inspector客户端必须知道并指定要连接到WebSocket接口的主机地址、端口和UUID,完整的URL是ws://127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e,当然取决于实际的主机和端口以及实例的正确UUID。

Inspector还包括一个HTTP端点,用于提供有关调试对象的元数据,包括其WebSocket URL,UUID和Chrome DevTools URL,通过向http://[host:port]/json/list发送HTTP请求来获取此元数据,这将返回一个JSON对象,如下所示;使用webSocketDebuggerUrl属性作为URL直接连接到Inspector。

{"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。

安全影响

由于调试器具有对Node.js执行环境的完全访问权限,因此能够连接到此端口的恶意行为者可以代表Node进程执行任意代码,了解在公共和专用网络上公开调试器端口的安全隐患非常重要。

公开公共调试端口是不安全的

如果调试器绑定到公共IP地址或0.0.0.0,则任何可以访问你的IP地址的客户端都可以无限制地连接到调试器,并且能够运行任意代码。

默认情况下,node --inspect绑定到127.0.0.1,如果你打算允许外部连接到调试器,你需要明确提供公共IP地址或0.0.0.0等。这样做可能会给你带来潜在的重大安全威胁,我们建议你确保适当的防火墙和访问控制措施,以防止安全风险。

有关如何安全地允许远程调试器客户端连接的一些建议,请参阅“启用远程调试方案”一节。

本地应用程序可以完全访问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+

  • 选项1:在基于Chromium的浏览器中打开chrome://inspect,点击配置按钮,确保列出目标主机和端口。
  • 选项2:从/json/list的输出(见上文)或--inspect提示文本复制devtoolsFrontendUrl并粘贴到Chrome中。
  • 选项3:安装Chrome扩展程序NIM(Node Inspector Manager):https://chrome.google.com/webstore/detail/nim-node-inspector-manage/gnhhdgbaldcilmgcpfddgdbkhjohddkj。

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应用程序

Node.js 指南(入门指南)相关推荐

  1. node.js快速入门指南

    Node.js迅速蹿红,衍生了一个强大的开源社区.支持企业,甚至还拥有属于自己的技术大会.我把这种成功归结于它的简介,高校,同时提高了编程生产力. Node.js 的前置知识很多,例如以下知识 Jav ...

  2. D3.js从入门指南

    D3.js从入门指南 前言 近期略有点诸事不顺,趁略有闲余之时,玩起D3.js.之前实际项目中主要是用各种chart如hightchart.echarts等,这些图形库玩起来貌都是完美的,一切皆可配置 ...

  3. 54 Node.js快速入门

    技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.Node开发概述 1.1 为什么要学习服务器端开发基础 能够与后端程序员更加紧密的配合 ...

  4. Node.js核心入门(二)

    目录: Node.js核心入门(一) 全局对象 常用工具 事件机制 Node.js核心入门(二) 文件系统访问 HTTP服务器与客户端 文件系统 fs fs 模块是文件操作的封装,它提供了文件的读取. ...

  5. Node.js:入门资料

    <快速搭建 Node.js 开发环境以及加速 npm> http://fengmk2.com/blog/2014/03/node-env-and-faster-npm.html <N ...

  6. Node.js开发入门—使用jade模板引擎

    在"Node.js开发入门--Express安装与使用"里,我们曾经使用express generator创建了一个HelloExpress网站,express工具为我们生成了基本 ...

  7. Node.js开发入门—Express安装与使用

    之前我们在安装完Node.js后直接写了个HelloWorld网站,这次呢,我们使用Node.js的Web框架Express来重写一下HelloWorld,看看有什么不同.同时我们还会重写之前的文件服 ...

  8. Node.js开发入门—语音合成示例

    出于项目需要,搞了一个语音合成(TTS)的小示例,使用的是OKVoice. 我想在PC上测试,OKVoice的快速接入API可以实现我的目的,文档在这里:http://dev.okvoice.com/ ...

  9. Node.js 新手入门

    Node.js 新手入门 Node.js是运行在服务端的JavaScript运行环境(runtime).实际上它是对Google V8引擎进行了封装.V8引 擎执行Javascript的速度非常快,性 ...

  10. Vue.js新手入门指南

    最近在逛各大网站,论坛,以及像SegmentFault等编程问答社区,发现Vue.js异常火爆,重复性的提问和内容也很多,楼主自己也趁着这个大前端的热潮,着手学习了一段时间的Vue.js,目前用它正在 ...

最新文章

  1. BZOJ 3132 上帝造题的七分钟(二维树状数组)
  2. window 杀死已开任务启命令
  3. 怎么看android sdk 文档
  4. mappedbytebuffer_Java NIO Buffer【MappedByteBuffer】概述与FileChannel的联系
  5. 3个图表突出数据显示小技巧,帮你一秒锁定关键信息
  6. 信息学奥赛C++语言:找第一个只出现一次的字符
  7. EXCEL里常用的几个正则表达式
  8. 洒脱书法!值得学习的帅气高级手写字体设计
  9. BUUCTF Web [ACTF2020 新生赛]Exec
  10. Qt TextEdit 不自动换行 取消换行
  11. 《2021中国数据智能产业图谱3.0升级版》重磅发布
  12. android调起浏览器设置头部,Android开发:调起手机浏览器
  13. SQL语句中case、when、then的使用
  14. android 补间动画停止,Android动画原理分析(一)---补间动画
  15. matlab适应度函数为什么有2个输出,基于遗传算法的LQR优化问题,适应度函数总是报错。...
  16. 全球案例 | 一家有着百年历史的航空公司如何扩展和转型,推动航空业创新
  17. cocos网络通信php,Cocos2D-X服务器的网络通信编程
  18. Ubuntu系统进行复制粘贴文件显示没有权限的解决办法
  19. Ubuntu发布移动版操作系统
  20. 我从来不指望吸引别人,我觉得这样很浅薄,我得吸引我自己

热门文章

  1. 3年了,才这点工资,打死我都不相信
  2. 【081】◀▶ HTML CSS 学习
  3. 判斷指定資料庫存取權
  4. 操作系统双语阅读 - Schedulers调度器2
  5. element-ui滚动条组件el-scrollbar
  6. Java 集合系列:Vector源码深入解析
  7. go语言的安装、环境变量配置及简单使用
  8. java.sql.SQLException
  9. jsp 中实现点击按钮 实现页面跳转到HTML
  10. Pig安装及简单使用(pig0.12.0 hadoop2.2.0)