Node.js 官网入门教程(四) EventEmitter、HTTP(GET、POST(axios))、Express、fs文件模块(描述符、属性、路径、读取、写入、文件夹)
文章目录
- Node.js 官网入门教程(四) EventEmitter、HTTP(GET、POST(axios))、Express、fs文件模块(描述符、属性、路径、读取、写入、文件夹)
总结:
通用
Node.js安装包:http://nodejs.cn/download/。
API检索网址:API 文档 | Node.js 中文网 (nodejs.cn)
第三方模板引擎:art-template官方文档
npm init 生成 package.json文件。
- 提供了创建 Web 服务器的最简单但功能最强大的方法之一。 它的极简主义方法,专注于服务器的核心功能,是其成功的关键。
- 基于 Node.js 平台,快速、开放、极简的 Web 开发框架。
koa: 由 Express 背后的同一个团队构建,旨在变得更简单更轻巧。 新项目的诞生是为了满足创建不兼容的更改而又不破坏现有社区。
readyState
- 存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。
- 0: 请求未初始化
- 1: 服务器连接已建立
- 2: 请求已接收
- 3: 请求处理中
- 4: 请求已完成,且响应已就绪
status
- 200, OK,访问正常
- 301, Moved Permanently,永久移动
- 302, Moved temporarily,暂时移动
- 304, Not Modified,未修改
- 307, Temporary Redirect,暂时重定向
- 401, Unauthorized,未授权
- 403, Forbidden,禁止访问
- 404, Not Found,未发现指定网址
- 500, Internal Server Error,服务器发生错误
MIME Type
MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准,说白了也就是文件的媒体类型。浏览器可以根据它来区分文件,然后决定什么内容用什么形式来显示。
首先,我们要了解浏览器是如何处理内容的。在浏览器中显示的内容有 HTML、有 XML、有 GIF、还有 Flash ……那么,浏览器是如何区分它们,决定什么内容用什么形式来显示呢?答案是 MIME Type,也就是该资源的媒体类型。
媒体类型通常是通过 HTTP 协议,由 Web 服务器告知浏览器的,更准确地说,是通过 Content-Type 来表示的,例如:
Content-Type: text/HTML
- 表示内容是 text/HTML 类型,也就是超文本文件。为什么是“text/HTML”而不是“HTML/text”或者别的什么?MIME Type 不是个人指定的,是经过 ietf 组织协商,以 RFC 的形式作为建议的标准发布在网上的,大多数的 Web 服务器和用户代理都会支持这个规范 (顺便说一句,Email 附件的类型也是通过 MIME Type 指定的)。
CLI
HTTP
- GET、POST
- GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连,如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD。如果数据是英文字母或数字,则原样发送;如果是空格,转换为+;如果是中文或其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII码值。而与之对应的,POST把提交的数据放置在HTTP包的包体中,文章最下面将会有代码示例。
- POST的安全性要比GET的安全性高。注意:这里所说的安全性和上面GET提到的“安全”不是同个概念。上面“安全”的含义仅仅是不作数据修改,而这里安全的含义是真正的Security的含义。比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为:(1)登录页面有可能被浏览器缓存,(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击(CSRF,跨站请求伪造,也被称为:one click attack/session riding)。
fs文件模块
fs.open()
fs.open('/Users/joe/test.txt', 'r', (err, fd) => { //fd 是文件描述符。 })
r+
打开文件用于读写。
w+
打开文件用于读写,将流定位到文件的开头。如果文件不存在则创建文件。
a
打开文件用于写入,将流定位到文件的末尾。如果文件不存在则创建文件。
a+
打开文件用于读写,将流定位到文件的末尾。如果文件不存在则创建文件。fs.stat()
- 每个文件都带有一组详细信息,可以使用 fs.stat() 进行检查。
- 使用
stats.isFile()
和stats.isDirectory()
判断文件是否目录或文件。- 使用
stats.isSymbolicLink()
判断文件是否符号链接。- 使用
stats.size
获取文件的大小(以字节为单位)。路径
dirname
: 获取文件的父文件夹。basename
: 获取文件名部分。extname
: 获取文件的扩展名。- 如果第一个参数以斜杠开头,则表示它是绝对路径
path.join()
连接路径的两个或多个片段path.resolve()
获得相对路径的绝对路径计算path.normalize()
当包含诸如.
、..
或双斜杠之类的相对说明符时,其会尝试计算实际的路径读取文件
fs.readFile()
方法: Node.js 中读取文件最简单的方式
fs.readFileSync()
:同步的版本
fs.readFile()
和fs.readFileSync()
都会在返回数据之前将文件的全部内容读取到内存中。这意味着大文件会对内存的消耗和程序执行的速度产生重大的影响。
在这种情况下,更好的选择是使用流来读取文件的内容。
写入文件
fs.writeFile()
APIfs.writeFileSync()
fs.appendFile()
(及其对应的fs.appendFileSync()
)追加到文件末尾文件夹
fs.access()
检查文件夹是否存在以及 Node.js 是否具有访问权限fs.mkdir()
或fs.mkdirSync()
可以创建新的文件夹fs.readdir()
或fs.readdirSync()
可以读取目录的内容fs.rename()
或fs.renameSync()
可以重命名文件夹fs.rmdir()
或fs.rmdirSync()
可以删除文件夹- 删除包含内容的文件夹可能会更复杂。最好安装
fs-extra
模块
1. Node.js 事件触发器(EventEmitter)
如果你在浏览器中使用 JavaScript,则你会知道通过事件处理了许多用户的交互:鼠标的单击、键盘按钮的按下、对鼠标移动的反应等等。
在后端,Node.js 也提供了使用 events
模块构建类似系统的选项。
具体上,此模块提供了 EventEmitter
类,用于处理事件。
使用以下代码进行初始化:
const EventEmitter = require('events')
const eventEmitter = new EventEmitter()
该对象公开了 on
和 emit
方法。
emit
用于触发事件。on
用于添加回调函数(会在事件被触发时执行)。
例如,创建 start
事件,并提供一个示例,通过记录到控制台进行交互:
eventEmitter.on('start', () => {
console.log('开始')
})
当运行以下代码时:
eventEmitter.emit('start')
事件处理函数会被触发,且获得控制台日志。
可以通过将参数作为额外参数传给 emit()
来将参数传给事件处理程序:
eventEmitter.on('start', number => {
console.log(`开始 ${
number}`)
})
eventEmitter.emit('start', 23)
多个参数:
eventEmitter.on('start', (start, end) => {
console.log(`从 ${
start} 到 ${
end}`)
})
eventEmitter.emit('start', 1, 100)
EventEmitter 对象还公开了其他几个与事件进行交互的方法,例如:
once()
: 添加单次监听器。removeListener()
/off()
: 从事件中移除事件监听器。removeAllListeners()
: 移除事件的所有监听器。
可以在事件模块的页面 http://nodejs.cn/api/events.html 上阅读其所有详细信息。
2. 搭建 HTTP 服务器
这是一个简单的 HTTP web 服务器的示例:
const http = require('http')
const port = 3000
const server = http.createServer((req, res) => {
res.statusCode = 200
res.setHeader('Content-Type', 'text/plain')
res.end('你好世界\n')
})
server.listen(port, () => {
console.log(`服务器运行在 http://${
hostname}