小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
本文主要介绍如何使用node启动一个服务,效果等同于使用nginx、apache等启动程序,在网络相通的情况下能够被其他服务器访问。并输出所有接口供测试人员分析使用。
输出所有接口
在开发过程中打断点可以看到,所有localhost:8082/isui的请求都会进入http.createServer回调中,因此只需要在回调函数中输出所有所有请求路径即可,此处以输出excel为例。
安装node-xlsx
终端输入命令:npm install node-xlsx
安装完毕后,多了文件夹node_modules和package-lock.json,如下图
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,打开结果如下:
总结
除了静态资源文件路径,特意在代码里加了一个接口测试,可以看到第32行接口路径也是可以输出的。如需过滤出所有的后端接口,需根据实际项目接口标识来过滤即可。