# node **Repository Path**: manbalChen/node ## Basic Information - **Project Name**: node - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-09-06 - **Last Updated**: 2020-12-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #### node 介绍 Node.js 应用是由哪几部分组成的: 1. 引入 required 模块:我们可以使用 require 指令来载入 Node.js 模块 2. 创建服务器:服务器可以监听客户端的请求,类似于 Apache 、Nginx 等 HTTP 服务器 3. 接收请求与响应请求 服务器很容易创建,客户端可以使用浏览器或终端发送 HTTP 请求,服务器接收请求后返回响应数据 Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境 1. node 回车后 可以进行 读取 执行 打印 循环 #### 事件循环 1. Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高 2. Node.js 几乎每一个 API 都是支持回调函数的 3. Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现 #### Stream(流) 1. Readable - 可读操作。 2. Writable - 可写操作。 3. Duplex - 可读可写操作. 4. Transform - 操作被写入数据,然后读出结果 所有的 Stream 对象都是 EventEmitter 的实例。常用的事件有: 1. data - 当有数据可读时触发。 2. end - 没有更多的数据可读时触发。 3. error - 在接收和写入过程中发生错误时触发。 4. finish - 所有数据已被写入到底层系统时触发。 #### 模块系统 1. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。 2. 代码 require('./hello') 引入了当前目录下的 hello.js 文件(./ 为当前目录,node.js 默认后缀为 js) 3. Node.js 提供了 exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象 4. exports 和 module.exports 的使用:如果要对外暴露属性或方法,就用 exports 就行,要暴露对象(类似class,包含了很多属性和方法),就用 module.exports 5. exports 仅仅是 module.exports 的一个引用 6. function require(...){ var module = {exports: {}}; ((module, exports) => { function myfn () {} // 这个myfn就是我们自己的代码 exports.myfn = myfn; // 这里是在原本的对象上添加了一个myfn方法。 module.exports = myfn;// 这个直接把当初的对象进行覆盖。 })(module,module.exports) return module.exports; } #### 全局对象 1. Node.js 中的全局对象是 global, 在 Node.js 我们可以直接访问到 global 的属性,而不需要在应用中包含它 2. __filename: 输出文件所在位置的绝对路径 3. __dirname: 表示当前执行脚本所在的目录 4. process: 描述当前Node.js 进程状态的对象,提供了一个与操作系统的简单接口 #### express-generator 1. npm i express-generator -g 2. express myapp 3. cd myapp 4. npm i 5. DEBUG=myapp:* npm start #### koa 1. 按照正常的编码顺序,在初始化完 koa 实例后(即 const app = new Koa()),我们需要调用 app.use() 去挂载我们的中间件 2. middleware的顺序很重要,也就是调用app.use()的顺序决定了middleware的顺序 3. koa-bodyparser解决koa post请求参数获取问题, koa-bodyparser 的函数执行后应该给我们返回了一个 async 函数 4. CORS完成跨域ajax请求 app.use(async (ctx, next) => { ctx.set('Access-Control-Allow-Origin', 'http://localhost:3000'); await next(); }); 5. 先注册bodyparser,再注册router.routes() 再监听3000 6. koa-bodyparser 中间件是将我们的 post 请求和表单提交的查询字符串转换成对象,并挂在 ctx.request.body 上 7. 引入的中间件都是在 use 方法中调用,由此我们可以分析出每一个 Koa 的中间件都是返回一个 async 函数的 #### 参与贡献 1. Fork 本项目 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request