node.js中 路由 和 中间件 的一个综合案例

首先是最终完完成的目录结构


先简单介绍一下这个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已经完成,如有什么问题,可以在博客下留言。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值