使用node创建服务并输出所有接口供测试分析(下)

288 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

本文主要介绍如何使用node启动一个服务,效果等同于使用nginx、apache等启动程序,在网络相通的情况下能够被其他服务器访问。并输出所有接口供测试人员分析使用。

输出所有接口

在开发过程中打断点可以看到,所有localhost:8082/isui的请求都会进入http.createServer回调中,因此只需要在回调函数中输出所有所有请求路径即可,此处以输出excel为例。

安装node-xlsx

终端输入命令:npm install node-xlsx

安装完毕后,多了文件夹node_modules和package-lock.json,如下图

image.png

node-xlsx使用demo:

var xlsx = require("node-xlsx");
var fs = require("fs");

var data = [
  {
    name: "sheet1",
    data: [
      ["ID", "Name", "Score"],
      ["1", "Michael", "99"],
      ["2", "Jordan", "98"],
    ],
  },
  {
    name: "sheet2",
    data: [
      ["AA", "BB"],
      ["23", "24"],
    ],
  },
];

// 写xlsx
var buffer = xlsx.build(data);
fs.writeFile("./resut.xls", buffer, function (err) {
  if (err) throw err;
  console.log("Write to xls has finished");

  // 读xlsx
  var obj = xlsx.parse("./" + "resut.xls");
  console.log(JSON.stringify(obj));
});

了解demo后再项目中使用,start.js完整代码如下

// 引入 http 模块
let http = require("http");

// 引入 fs 模块
let fs = require("fs");

// 引入 url 模块
let url = require("url");

// 引入 path 模块
let path = require("path");
let xlsx = require("node-xlsx");
var data = [
  {
    name: "sheet1",
    data: [["接口路径"]],
  },
];
http
  .createServer((req, res) => {
    // 获取响应路径
    let pathName = url.parse(req.url).pathname;
    data[0].data.push([pathName]);
    var buffer = xlsx.build(data);
    fs.writeFile("./resut.xls", buffer, function (err) {
      if (err) throw err;
      console.log("Write to xls has finished");
    });
    // 默认加载路径
    if (pathName == "/isui") {
      // 默认加载的首页
      pathName = "isui/index.html";
    }

    // 获取文件的后缀名
    let extName = path.extname(pathName);

    // 过滤 /favicon.ico 的请求
    /**
     * 访问地址是:http://localhost:3000/?userName=jsliang&userAge=23
     * 如果你执行 console.log(req.url),它将执行两次,分别返回下面的信息:
     * /  ?userName=jsliang&userAge=23
     * /  /favicon.ico
     * 这里为了防止重复执行,所以排除 req.url == /favicon.ico 的情况
     */
    if (pathName != "/favicon.ico") {
      // 获取 08_WebService 下的 index.html
      fs.readFile("./" + pathName, (err, data) => {
        // 如果不存在这个文件
        if (err) {
          console.log("404 Not Found!");
          fs.readFile("./isui/404.html", (errorNotFound, dataNotFound) => {
            if (errorNotFound) {
              console.log(errorNotFound);
            } else {
              res.writeHead(200, {
                "Content-Type": "text/html; charset='utf-8'",
              });
              // 读取写入文件
              res.write(dataNotFound);
              // 结束响应
              res.end();
            }
          });
          return;
        }
        // 返回这个文件
        else {
          // 获取文件类型
          let ext = getExt(extName);
          console.log(ext);

          // 设置请求头
          res.writeHead(200, {
            "Content-Type": ext + "; charset='utf-8'",
          });
          // 读取写入文件
          res.write(data);
          // 结束响应
          res.end();
        }
      });
    }
  })
  .listen(8082);

// 通过后缀名获取对应的Content-Type
getExt = (extName) => {
  // readFile 是异步操作,所以需要使用 readFileSync
  let data = fs.readFileSync("./config.json");
  let ext = JSON.parse(data.toString());
  return ext[extName];
};

重启node服务,在目录下会发现多了一个文件result.xls,打开结果如下:

image.png

总结

除了静态资源文件路径,特意在代码里加了一个接口测试,可以看到第32行接口路径也是可以输出的。如需过滤出所有的后端接口,需根据实际项目接口标识来过滤即可。