首先是最终完完成的目录结构
先简单介绍一下这个demo的功能
1. 托管了 assets 目录下的静态资源,即:可通过在url上输入对应文件名,来访问对应页面
2. 日志记录需求, 每当有客户端来请求服务器,需要记录一下请求时间,请求url地址,以及请求方式(对应writeLogs.js)
3. 接受并处理表单传递过来的数据 (对应passData.js页面)
4. 一个简单的路由功能 (对应router.js页面)
5. middleWaerAll.js就是我们最终整合完成后的页面
直接上代码
-- writeLogs.js(日志记录页面)
// 导入路径模块
const path = require("path");
// 导入 fs模块
const fs = require("fs");
// 记录日志的中间件
function myMiddleWareWriteLogs(req, res, next) {
// 要记录的信息
const infoStr = `${new Date().toLocaleString()} ${req.method} ${req.url}\n`
// 调用 fs 记录日志
fs.appendFile(path.join(__dirname, "./info.txt"), infoStr, (err) => {
if (!err) console.log("写入OK")
next()
})
}
// 暴露出去
module.exports = myMiddleWareWriteLogs;
-- passData.js(解析表单数据页面)
// querystring 模块提供了一些实用函数,用于解析与格式化 URL 查询字符串
const querystring = require('querystring');
function editData(req,res,next) {
let str = "";
// data 事件触发时就会有数据提交,可执行多次, chunk是一个代码段,数据过大时,会分多次提交
req.on("data", (chunk) => {
str += chunk
})
// end 表示数据提交完毕
req.on("end", () => {
const result = querystring.parse(str)
// 中间件之间,共享的是 req 和 res 这两个对象,所以我们需要的数据绑定在req对象身上
req.body = result
// 在中间件这个函数的参数列表中,有个 next 函数,这个 next 函数,只要一被调用,就会进入到下一个中间件的处理环节
next()
})
}
// 暴露出去
module.exports = editData;
-- router.js(路由页面)
const express = require("express");
const router = express.Router();
// 此时路由监听的是post请求,访问路径为 api/postinfo
router.post('/api/postinfo', (req, res) => {
// 拿到提交数据并返回
res.send('你提交的数据是: ' + JSON.stringify(req.body))
});
module.exports = router;
-- middleWaerAll.js(运行的页面)
const express = require("express");
const urlencode = require("urlencode")
// 创建一个服务器
const app = express();
// 导入自己记录日志的中间件
const writeLogs = require("./writeLogs.js");
// 注册记录日志的中间件
app.use(writeLogs);
// 使用 express.static 来托管 assets 目录
app.use(express.static("./assets"))
// 导入解析表单数据的中间件
const editData = require("./passData")
// 注册解析表单的中间件
app.use(editData)
// 导入自己的路由模块
const router = require("./router");
// 注册自己的路由模块
app.use(router);
//运行服务器
app.listen(3000, () => {
console.log("server is running")
})
当然上面代码的运行需要依赖 express 框架。
安装:$ npm install express --save
接下来可以测试一下是否都满足我们得需求
运行:
这里使用的的 nodemon插件(不用频繁的重启服务器,自动帮你完成),这一篇博客最后介绍了 nodemon的使用点击打开链接 。
发送请求:
这里成功拿到我们之前托管的页面,接下来看能否自动记录日志
注意:这里index.html页面中外联了一个js文件,页面中的红色就是他的功劳。
接下来我们验证能否接收到表单提交的数据。注意: post请求并不能通过地址栏来发送,这里我们使用一个工作中经常用的插件 Postman, 它可以帮我们模拟发送各种请求。
可以看到已经成功的接收到了表单发送的数据。
再看一下我们的日志记录
ok。那么这一个小的demo已经完成,如有什么问题,可以在博客下留言。