Node.js 的常用模块
1. events模块
事件驱动是node.js
的基本特点,因此events
模块非常重要。使用events
模块分为3步:实例化事件监听器;注册事件;触发事件。
const Events = require('events'); // 也常写作:const EventEmitter = ...
const Listener = new Events(); // 实例化事件监听器
// 注册事件
Listener.on('click', function(param){ // 也可以: Listener.once('click', ...)
console.log('触发了点击', param);
});
// 触发事件
Listener.emit('click', 'demo');
// 再次触发事件(注册时为 Listener.on('click', ...)可二次触发)
Listener.emit('click', 'demo1')
2. fs模块
fs
是File System
的缩写,也就是node.js
用来操作系统文件的模块。
// 第一个参数使用为path
fs.readFile()
fs.writeFile()
fs.appendFile() // 追加写入
fs.unlink() // 删除文件,不能删除文件夹
fs.mkdir()
fs.readdir()
fs.rmdir() // 删除文件夹
3. stream模块
stream
是EventEmitter
的实例,所以本质上是一个Listener
。常用的事件有:
data: 当有数据可读时触发;
end: 当没有更多数据可读时触发;
error: 读取或写入时发生错误时触发;
finish: 所有数据都写入系统底层时触发。
node.js
中有4种类型的stream:
Readable: 可读
Writable: 可写
Duplex: 可读可写
Transform: 数据转换
4. http模块
主要用于创建HTTP服务器
处理请求;创建HTTP客户端
发出请求。
5. express模块
express是一个web应用框架,主要用于创建各种web应用,使用express可以快速地搭建一个完整功能的网站。express框架的核心特性如下:
- 通过设置中间件来处理HTTP请求
- 通过路由来执行不同的HTTP请求操作
- 通过模板来渲染HTML页面
6. 留言板
首先,搭建一个环境:
>>> mkdir express-example
>>> cd express-example
>>> npm init -y
>>> npm install express body-parser ejs --save
index.js
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
// 设置ejs模板引擎. 『express 支持 jade, pug, mustache, ejs』
app.set('view engine', 'ejs');
// 设置模板文件目录
app.set('views', './templates');
app.use(bodyParser()); // 请求体解析中间件配置
const messages = [] // 留言内容
// -------设置路由-------
// 首页路由
app.get('/', (req, res)=>{
res.render('index', {messages});
});
// 留言页路由
app.route('/publish')
.get((req, resp)=>{
resp.render('publish'); // 渲染HTML页面
})
.post((req, resp)=>{
if (!req.body.name || !req.body.content){
throw new Error('请将所有选项填写完整!');
}
const now = (new Date()).toLocaleString();
messages.push({
name: req.body.name,
content: req.body.content,
time: now // 留言事件
});
resp.redirect('/'); // 重定向到首页
});
// --------开启监听----------
app.listen(8080, ()=>{
console.log('listen on 8080');
});
templates/index.ejs
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>留言列表</title>
</head>
<body>
<a href="/publish">发表留言</a>
<% if (messages.length === 0) {%>
<p>当前没有留言</p>
<% } else { %>
<table>
<tr>
<th>留言时间</th>
<th>留言人</th>
<th>留言内容</th>
</tr>
<% messages.forEach((message) => { %>
<tr>
<td><%= message.time%></td>
<td><%= message.name%></td>
<td><%= message.content%></td>
</tr>
<% }) %>
</table>
<% } %>
</body>
</html>
templates/publish.ejs
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>发表留言</title>
</head>
<body>
<form action="/publish" method="POST" enctype="application/x-www-urlencoded">
<fieldset>
<legend>发表留言</legend>
<div>
<label for="name">姓名</label>
<input type="text" name="name" id="name" required>
</div>
<div>
<label for="content">内容</label>
<textarea name="content"></textarea>
</div>
<div>
<button type="submit">发表</button>
<button type="reset">重置</button>
</div>
</fieldset>
</form>
</body>
</html>