文章目录
node.js应用组成部分
- 引入required模块: 我们可以使用 require 指令来载入 Node.js 模块。
- 创建服务器: 服务器可以监听客户端的请求,类似于 Apache 、Nginx 等 HTTP 服务器。
- 接收请求与相应请求: 服务器很容易创建,客户端可以使用浏览器或终端发送 HTTP 请求,服务器接收请求后返回响应数据。
创建服务器
- require指令载入http模块赋值给变量http
- createServer()创建服务器,并使用listen()绑定8888端口。函数通过request、response参数接收和响应数据
let http = require('http')
http.createServer( (request, response) => {
// 发送http头部
// HTTP状态值:200 -OK
// 内容类型:text/plain
response.writeHead(200, {'Content-Type': 'text/plain'})
// 发送响应数据
response.end('Hello world')
}).listen(8888)
// 终端打印如下信息
console.log('Server running at http://127.0.0.1:8888')
npm
- 使用淘宝镜像命令
npm install -g cnpm --registry=https://registry.npm.taobao.org
- 查看所有全局安装的模块
npm list -g
- 查看模块版本号
npm list ××
- 卸载模块
npm uninstall ××
- 更新模块
npm update ××
- 搜索模块
npm search ××
- package.json
位于模块目录下,用于定义包的属性
- code . 用编译器打开当前文件
- npm install ×× -D:将此安装为开发模式下的依赖
Package.json 属性说明
- name - 包名。
- version - 包的版本号。
- description - 包的描述。
- homepage - 包的官网 url 。
- contributors - 包的其他贡献者姓名。
- dependencies - 依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。
- repository - 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上。
- main - main 字段指定了程序的主入口文件,require(‘moduleName’) 就会加载这个文件。这个字段的默认值是模块根目录下面的 index.js。
- keywords - 关键字
NPM版本号
- NPM使用语义化版本号管理代码,语义化版本号分为X、Y、Z三位,分别代表主版本号、次版本号、补丁版本号
- 当代码变更时,版本号会按以下原则更新
- 如果只是修复bug,需要更新Z位。
- 如果是新增了功能,但是向下兼容,需要更新Y位。
- 如果有大变动,向下不兼容,需要更新X位。
REPL (交互式解析器)
类似于windows的powershell窗口
- 下划线(_)变量:获取上一个表达式的运算结果
Node.js文件系统
fs模块是node.js的文件系统模块,负责读、写文件
- readFileSync() 同步读取方法 顺序执行
- readFile 异步读取方法,可接收回调函数 不按顺序执行
/* 异步读取方法 */
const fs = require('fs')
fs.readFile('input.txt', (err, data) => {
if (err) return console.log(err)
console.log(data.toString())
})
console.log('程序结束!')
- 打开文件 fs.open(path, flags, callback)
- 文件路径,文件打开行为,回调函数
- 获取文件信息 fs.stat(path, (err, stats) => {})
- 关闭文件 fs.close(fd, callback)
- 截取文件 fs.ftruncate(fd, len, callback)
- 删除文件 fs.unlink(path, callback)
EventEmitter类
- on函数用于绑定时间名, emit属性触发事件
- EventEmitter的每一个事件由一个时间名和若干个参数组成
- 事件触发时,注册到这个事件的事件监听器依次被执行,事件参数作为回调函数参数传递
// 引入events模块
const events = require('events')
// 创建eventEmitter对象
const eventEmitter = new events.EventEmitter()
// 创建事件处理程序
const connectHandle = function connected () {
console.log('连接成功!')
eventEmitter.emit('data_received')
}
// 绑定 connection 事件处理程序
eventEmitter.on('connection', connectHandle)
// 使用匿名函数绑定 data_received 事件
eventEmitter.on('data_received', () => {
console.log('数据接收成功!')
})
// 触发 connection 事件
eventEmitter.emit('connection')
console.log('程序执行完毕!')
- EventEmitter属性&方法
- once(event, listener) 触发一次后移除
- removeListener(event, listener)
- listenerCount(emitter, event) 返回指定事件的监听器数量
-
events.emitter.listenerCount(eventName) //推荐
-
exports 和 mudule.exports的使用区别
- exports 对外暴露属性和方法
- mudule.exports 暴露对象(类似class),包含很多属性和方法
exports.world = () => {} // 暴露world方法
module.exports = Hello // 暴露Hello类
node.js全局对象
注意:在 Node.js 中你不可能在最外层定义变量,因为所有用户代码都是属于当前模块的, 而模块本身不是最外层上下文。
- __filename 表示当前正在执行脚本的文件名。输入文件所在位置的绝对路径
- __dirname 表示当前执行脚本的所在目录
- setTimeout() 只执行一次指定函数
process
全局对象,即global的对象属性
它用于描述当前Node.js 进程状态的对象,提供了一个与操作系统的简单接口
Node.js工具模块
- OS模块 提供基本的系统操作函数
- Path模块 提供处理和转换文件路径的工具
- Net模块 用于底层的网络通信。提供了服务端和客户端的的操作。
- DNS模块 用于解析域名
- Domain模块 简化异步代码的异常处理,可以捕捉处理try catch无法捕捉的。