# nodejs-base **Repository Path**: bingohello/nodejs ## Basic Information - **Project Name**: nodejs-base - **Description**: nodejs基础入门 - **Primary Language**: NodeJS - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-03-08 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Node.js ## 1.认识Node.js ### 1.1 诞生 > Node.js诞生于2008年 > > Ryan Dahl的目标:创建一个易扩展、适用于现代Web应用通讯的服务器平台 ### 1.2 为什么要用Node.js > 火 ![](https://i.imgur.com/0aOJgnN.png) ![](https://i.imgur.com/Oe2GmSv.png) > 强 > ![](https://i.imgur.com/QRWkT6Z.png) Node-Webkit、app.js可以用html+css开发跨平台的桌面应用程序 jade模板引擎,可以高效的开发和管理后台模板 Ghost开源的博客框架 Grunt、Gulp集成各种插件来完成自动化构建 ### 1.3 国内外的应用情况 > Twitter > 知乎 > 网易 > 阿里 ### 1.4 应用领域 > RESTFul API > 实时通信:消息推送等 > 高并发 > I/O阻塞 ### 1.5 社区 > nodejs.org看看nodejs的版本升级,新特性的加入,重要bug的修复等 > > www.npmjs.com模块社区,看他人源代码,省力 > > github.com大量的项目和源码 > > stackoverflow.com技术解答社区以及查询相关资源,环境配置,异常均可找到答案 ### 1.6 开源框架 ![](https://i.imgur.com/sxCSb24.png) ## 2.Node.js 与 JavaScript 的关系 在nodejs出现之前,javascript主要应用于浏览器端,所以nodejs也很好理解了,nodejs是对javascript脱离浏览器的应用延展,它还提供了运行引擎与相关API,所以nodejs是javascript开发本地应用、服务器应用的一个开发套件或运行环境。 ![](https://i.imgur.com/jxinZYc.png) ## 3.Node.js 的特点 ### 3.1 部署简单方便 > 环境配置简单,只需安装Node.js即可 > > 注重约定 > > 项目所需要扩展、插件、资源相对独立,不易冲突 ### 3.2 事件驱动 > 根据系统当前的事件进行资源的调度 ### 3.3 异步编程 > 回调函数 > > 事件监听 > > 订阅/发布 ### 3.4 高效与性能 > 单个操作的性能并不优于其它解决方案 > > 通过优化资源调配和I/O操作来实现高效 ### 3.5 单线程与多进程 > Google V8是单线程的,所以Node.js与同样是单进程的。为了更好利用CPU资源,可以利用子进程和多进程: > > 子进程:Node.js的child_process模块 > 多进程:PM2等第三方工具 ### 3.6 Node.js的缺点 > 大量采用匿名函数,使得抛出的异常不易阅读 > > try/catch限于同步代码,使得异常捕获较为复杂 > > 单线程:可靠性 > > 不适合CPU密集型场景 > > 回调的代码习惯影响阅读 # 4. 安装 ## 4.1 下载 到官网[https://nodejs.org/en/]()下载最新版 ## 4.2 安装 4.2.1 双击安装文件 ![](https://i.imgur.com/hdcftNF.png) 4.2.2 “Next” ![](https://i.imgur.com/EcFVXEh.png) 4.2.3 “Next” ![](https://i.imgur.com/5rR9U0k.png) 4.2.4 选择安装路径后“Next” ![](https://i.imgur.com/g3zB659.png) 4.2.5 “Next” ![](https://i.imgur.com/vzkry4b.png) 4.2.6 “Install” ![](https://i.imgur.com/3dOgeMx.png) ![](https://i.imgur.com/QpZXvC0.png) 4.2.7 “Finish” ![](https://i.imgur.com/qsr6y8G.png) 4.2.8 打开命令提示符,输入node -v如下图所示表示安装完成 ![](https://i.imgur.com/CBQU9zg.png) # 5. 基础入门 ## 5.1 URL ![](https://i.imgur.com/CNDnwLz.png) ## 5.2 通信过程 ![](https://i.imgur.com/I6kDc9Y.png) ## 5.3 http状态值 ![](https://i.imgur.com/l3JFD3c.png) ## 5.4 应用程序 > express模块依赖安装 npm install express > 引入express并创建服务 var express = require('express); var app = express(); app.listen(80); > 第一个路由应用 var express = require('express); var app = express(); //路由 app.get('/', function(req, res){ res.send('hello'); }); app.listen(80); > use方法 var express = require('express'); //用来解析请求的body,当数据以post方式请求时,数据是以一定格式编码的,bodyParser作用是解码 var bodyParser = require('body-parser'); var app = express(); //json类型body,第一个资源路径参数省略表示所有的请求都可以拦截 app.use(bodyParser.json()); //还原成数据对象 //query string类型body app.use(bodyParser.urlencoded({ extended: false })); //静态文件目录,__dirname表示当前应用所在路径 app.use(express.static(__dirname + '/public')); app.listen(80); > 路由拆分管理 app.js var express = require('express'); var bodyParser = require('body-parser'); var app = express(); //json类型body app.use(bodyParser.json()); //query string类型body app.use(bodyParser.urlencoded({ extended: false })); //静态文件目录 app.use(express.static(__dirname + '/public')); //路由与业务逻辑 app.use('/user', require('./routes/user.js')); app.listen(80); routes/users.js var express = require('express'); var router = express.Router(); router.all('/list', function (req, res) { console.log(req.method); console.log(req.baseUrl); console.log(req.path); console.log(req.headers['user-agent']); //获取某一请求头 console.log(req.get('user-agent')); //url查询参数 console.log(req.query); //获取url查询参数值 console.log(req.query.id); //post请求时,获取body中的参数值 console.log(req.body); console.log(req.body.id); res.send('hello'); }); router.get('/:id', function (req, res) { //rest风格 console.log(req.params.id); res.send('ok'); }) router.get('/fb', function (req, res) { res.status(403).send('forbidden!'); })