当前位置: 首页 > 文档资料 > 阅读 express 源码 >

2.5 自己动手写一个日志中间件

优质
小牛编辑
128浏览
2023-12-01

当我们的网站运行在线上的时候,我们可能希望记录一下访问者的 IP 地址,以及一些其他操作,比如说敏感操作。这一小节,我们就来完成它,不过我这里完全是抛砖引玉,这里存储日志的地方是本地的文件夹,你大可以存放到数据库中,或者其他服务器提供商存储空间里面,比如 LeanCloud、FireBase 等等。

2.5.1 初始化项目

mkdir ep && cd ep
npm init -y

npm i -S express

2.5.2 新建 app.js

vim app.js
const express = require('express');
const app = express();

app.get('/', function (req, res, next) {
  res.send("Hello World")
});

app.listen(3000);

:wq 进行保存。

2.5.3 运行

node app.js

打开 localhost:3000,此刻我们的 helloworld 已经成功的运行了。

2.5.4 新建 log.js

一共30几行代码,这个中间件非常的简单。

const fs = require('fs');
const path = require('path');


const createFolderIfNotExists = (dir) => {
  try{
    fs.statSync(dir);
  }catch(e){
    fs.mkdirSync(dir);
    console.log("日志文件夹创建成功");
  }

}

module.exports = function(opts = {}){
  return (req, res, next) => {
    const outPutDir = opts.output || path.resolve(__dirname, 'logs');
    const nowDate = new Date();

    if (opts.close) {
      return next();
    }

    const logMsg = `${nowDate.toLocaleDateString()} ${nowDate.toLocaleTimeString()} => ${req.ip} \n`;

    createFolderIfNotExists(outPutDir)

    fs.createWriteStream(outPutDir + '/' + nowDate.toLocaleDateString() + '.log', {
      flags: 'a+'
    }).write(logMsg);

    return next();
  }
}

createFolderIfNotExists 是当不存在目录的时候进行创建,并且可以通过 opts.close 可以关闭该中间件。fs.createWriteStream 创建一个可写流,第一个参数是路径,第二个参数是配置项,之后给流 write 写入数据即可。这都是使用了 node.js 的一些 简单的 api。

2.5.5 在 app.js 使用 log 中间件

const express = require('express');
const app = express();
const log = require('./log');

app.use(log());

app.get('/', function (req, res, next) {
  res.send("Hello World")
});

app.listen(3000);

运行之后,访问网站,之后看看有没有 logs 文件夹,里面有没有数据。