当前位置: 首页 > news >正文

npm获取函数名称和测试js脚本

这边遇到一个类似于测试的需求,需要从一个js文件里获取函数名,然后尝试执行这些函数和创建实例。这边首先遇到了一个问题是如何动态获取js里的函数名和类名,我这边暂时没找到特别好的方法,已有的方法都是类似于提取语法树那种提取函数名
最后想的还是通过正则匹配函数名来尝试执行,有参数需求的函数尝试用数字代替作为参数尽量执行,加了个5秒超时

附:安装npm
https://nodejs.org/en

安装minimist(用于调用参数)

npm i minimist

调用

node tester.js --fp sample.js

代码:

const fs = require('fs');
const path = require('path');console.log("--fp指定路径");
var args = require('minimist')(process.argv.slice(2));
console.log("filepath:",args.fp);
// 目标文件路径
const targetPath = path.join(__dirname, args.fp);// 读取index.js文件内容
const fileContent = fs.readFileSync(targetPath, 'utf8');// 正则表达式匹配函数名和类名
const functionRegex = /function\s+(\w+)\s*\(/g;
const classRegex = /class\s+(\w+)/g;
const arrowFunctionRegex =  /([a-zA-Z_\$][a-zA-Z_\$0-9]*)\s*=\s*\([^)]*\)\s*=>/g;
// const arrowFunctionRegex = /^([^\(\)]+)\s*=>/;const functions = [];
const classes = [];// 匹配函数名
let match;
while ((match = functionRegex.exec(fileContent)) !== null) {functions.push(match[1]);
}
while ((match = arrowFunctionRegex.exec(fileContent)) !== null) {functions.push(match[1]);
}// 匹配类名
while ((match = classRegex.exec(fileContent)) !== null) {classes.push(match[1]);
}if (!fileContent.includes('module.exports')) {fs.writeFileSync(targetPath,fileContent +`\nmodule.exports = {${functions.join(',') + ',' + classes.join(',')}}`);
}const newRequire = require(targetPath);/**
*@name asyncFunction
*@des 异步函数
*@param use: () => void | unknow
*@return {Promise}*/const  asyncFunction = async(use) => {return new Promise( (resolve, reject) => {// 异步操作,例如 Ajax 请求或者定时器try {const result = use();if(result) resolve(result)} catch (error) {reject(error)}});
}// -- timeout 机制
function withTimeout(promise, timeout) {return Promise.race([promise,new Promise((resolve, reject) => {setTimeout(() => {reject(new Error('操作超时'));}, timeout);})]);
}// 处理类的方法
const onHandleClassFn = async (ClassName, target, name) => {const params = [];for (let i = 0; i < target.length; i++) {params.push('拟参' + i);}if (!/^class\s/.test(Function.prototype.toString.call(target))) {try {const result = await withTimeout(asyncFunction(() => {return target.length? target(...params): target()}),5000);console.log(`---------类${ClassName}${name}()的return结果:`, result);} catch (error) {console.log(`+++++++++抛出错误类${ClassName}${name}()函数执行出错,error信息:`, error);} }
};
for (const iterator in newRequire) {const target = newRequire[iterator];const params = [];for (let i = 0; i < target.length; i++) {params.push('拟参' + i);}if (!/^class\s/.test(Function.prototype.toString.call(target))) {try {target.length? console.log(`---------以上是${iterator}()执行的log,return:`,target(...params),'---------'): console.log(`---------以上是${iterator}()执行的log,return:`,target(),'---------');continue;} catch (error) {console.log(`+++++++++抛出错误函数${iterator}执行出错,error:`, error);}}const Instance = target.length ? new target(...params) : new target();// 获取构造函数包含的所有方法const methods = Object.getOwnPropertyNames(Instance.__proto__).filter((item) => item !== 'constructor');methods.forEach((item) => {onHandleClassFn(iterator, Instance[item], item);});
}

用于测试的脚本

function AFn() {console.log('Run Function A');return 'AFn is true'
}
function BFn(param1, param2) {console.log('Run Function B', param1, param2);return 'BFn is true'
}
const CFn = (param1, param2) => {console.log('Run Function C', param1, param2);return 'CFn is true'
}
class Cat {constructor(name, age) {this.name = name;this.age = age;}Say1(param1) {console.log('Say1方法参数:', param1);return 'Say1 is ' + +new Date();}Say2(param1,param2) {console.log('say2方法参数:', param1, param2);return 'Say2 is ' + +new Date();}ThrowerrFn(){return new Promise((resolve, reject) => {setTimeout(() => {console.log('这是一个异步模拟抛error出错误的函数');reject('this is a error_throw');}, 200);})}ThrowSuccessFn(){return new Promise((resolve) => {setTimeout(() => {console.log('这是一个异步模拟success的函数');resolve('success') }, 2000);})}ThrowTimeoutFn(){return new Promise((resolve) => {setTimeout(() => {resolve('timeout_success, 此结果会因为超时被阻塞输出')}, 6000);})}Say3(param1,param2) {console.log('say3方法参数:', param1, param2);return 'Say3 is ' + +new Date();}
}module.exports = {AFn,BFn,CFn,Cat}

相关文章:

npm获取函数名称和测试js脚本

这边遇到一个类似于测试的需求&#xff0c;需要从一个js文件里获取函数名&#xff0c;然后尝试执行这些函数和创建实例。这边首先遇到了一个问题是如何动态获取js里的函数名和类名&#xff0c;我这边暂时没找到特别好的方法&#xff0c;已有的方法都是类似于提取语法树那种提取…...

ISO/IEC/ITU标准如何快速查找(三十九)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…...

git私房菜

文章目录 1、公司项目开发Git协作流程2、合并相关的操作3、Git常用命令总结 公司中如何使用Git协同开发的&#xff1f;本文将具体介绍开发模式&#xff0c;以及一些常用命令。 1、公司项目开发Git协作流程 公司一个完整的项目出来&#xff0c;项目的推进是在主分支master上进行…...

docker安装grafana,prometheus,exporter以及springboot整合详细教程(GPE)

springboot项目ip:192.168.168.1 测试服务器ip:192.168.168.81 文章来自互联网,自己略微整理下,更容易上手,方便自己,方便大家 最终效果: node springboot 1.下载镜像 docker pull prom/node-exporter docker pull prom/mysqld-exporter docker pull google/cadvisor dock…...

cka/ckad应试指南 从docker到kubernetes完全攻略

《cka/ckad应试指南 从docker到kubernetes完全攻略》 段超飞 docker 1-安装并配置docker&#xff0c;yum源&#xff0c;docker下载慢 2-基本命令&#xff1a;镜像管理&#xff0c;基本命令&#xff0c;创建容器 3-网络&#xff0c;存储卷&#xff0c;镜像仓库&#xff0c; 4-do…...

js中如何使用可选函数参数

js是网络的核心技术之一。大多数网站都使用它&#xff0c;并且所有现代网络浏览器都支持它&#xff0c;而不需要插件。在本文中&#xff0c;我们将讨论不同的提示和技巧&#xff0c;它们将帮助您进行日常 JavaScript 开发。 在 JavaScript 编码中&#xff0c;您经常需要将函数…...

基于Open3D的点云处理17-Open3d的C++版本

参考&#xff1a; http://www.open3d.org/docs/latest/cpp_api.htmlhttp://www.open3d.org/docs/latest/getting_started.html#chttp://www.open3d.org/docs/release/cpp_project.html#cplusplus-example-projecthttps://github.com/isl-org/open3d-cmake-find-packagehttps:/…...

GIT相关内容总结

Git相关内容总结 Git的功能Git常见命令 Git的功能 Git是版本控制工具。版本控制就是记录你对文件做的所有改动的一个系统&#xff0c;包括改动的内容&#xff0c;改动的时间&#xff0c;改动的备注等&#xff0c;便于你恢复特定的版本。 版本控制系统分为本地版本控制系统&…...

golang清空数组的方法

在Go语言中&#xff0c;数组是固定长度的数据结构&#xff0c;无法直接清空。但是&#xff0c;你可以通过以下两种方法来模拟清空数组的效果&#xff1a; 使用切片&#xff08;Slicing&#xff09;&#xff1a; 切片是动态长度的&#xff0c;可以用来清空数组。你可以创建一个…...

postgresql并行查询(高级特性)

######################## 并行查询 postgresql和Oracle一样支持并行查询的,比如select、update、delete大事无开启并行功能后,能够利用多核cpu,从而充分发挥硬件性能,提升大事物的处理效率。 pg在9.6的版本之前是不支持的并行查询的,从9.6开始支持并行查询,但是功能非常…...

Python所有方向的学习路线图!!

学习路线图上面写的是某个方向建议学习和掌握的知识点汇总&#xff0c;举个例子&#xff0c;如果你要学习爬虫&#xff0c;那么你就去学Python爬虫学习路线图上面的知识点&#xff0c;这样学下来之后&#xff0c;你的知识体系是比较全面的&#xff0c;比起在网上找到什么就学什…...

2022年03月 C/C++(七级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:红与黑 有一间长方形的房子, 地上铺了红色、 黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上, 只能向相邻的黑色瓷砖移动。 请写一个程序, 计算你总共能够到达多少块黑色的瓷砖。 时间限制: 1000 内存限制: 65536 输入…...

使用 Laf 一周内上线美术狮 AI 绘画小程序

“美术狮 AI 绘画”&#xff08;以下简称“美术狮”&#xff09;&#xff0c;是我们小团队的一次尝试&#xff0c;定位是人人都可以上手的&#xff0c;充满创意的&#xff0c;理解中文和中国文化的图片生成工具。 在完善图像模型和论证核心问题之后&#xff0c;我们开始构建 MV…...

Kubernetes(k8s)当中安装并使用ingress暴露应用

Kubernetes当中安装并使用ingress暴露应用 为什么需要Ingress前期准备集群准备LoadBalancer准备 安装Ingress-Nginx下载地址v1.3.1v1.8.1 修改文件v1.3.1v1.8.1修改ingress服务类型配置 执行安装 部署应用通过ingress-nginx暴露应用部署ingress的yaml文件v1.3.1v1.8.1 为什么需…...

03-Flask-工程配置加载方式

工程配置加载方式 前言配置对象中加载配置文件中加载环境变量中加载三种配置方式优缺点工厂模式创建Flask app 前言 本篇来学习下Flake工程配置加载方式 配置对象中加载 应用场景&#xff1a;作为默认配置写在代码中 # -*- coding: utf-8 -*- # Time : 2023/9/2 # Autho…...

Orangepi安装外设库 wiringPi

注意&#xff1a;mobaXterm传送文件要在SSH登陆环境下才可以。 同时电脑和orangepi都在同一个wifi下。...

[dasctf]misc3 chrchrchr.pcapng

webshell 流量分析 php代码部分没啥看的&#xff0c;主要在标黄的部分&#xff0c;裁剪掉前面的字符可base解码 能看到在向a.txt中写入数据 wp # tshark.exe -r chrchrchr.pcapng -T fields -e urlencoded-form.value -Y "urlencoded-form.keyzd2ebbfb26dd" >…...

微服务--Sentinel(实现:服务高可用)

内存溢出&#xff1a;OOM 服务器挂掉的原因&#xff1a; 1.激增流量打垮&#xff1a; 1.流量突然飙升&#xff0c;导致CPU上升&#xff0c;出现挂机 2.负载不均&#xff1a;比如一个实例长期未重启&#xff0c;导致磁盘写满降低响应时间等。 3.线程池满&#xff0c;单点故障&…...

【MySQL】4、MySQL备份与恢复

备份的主要目的是灾难恢复&#xff0c;备份还可以测试应用、回滚数据修改、查询历史数据、审计等 MySQL日志管理 MySQL 的日志默认保存位置为 /usr/local/mysql/data #配置文件 vim /etc/my.cnf 日志的分类 常见日志有&#xff1a; 错误日志&#xff0c;一般查询日志&…...

python后端,一个账户,多设备登录管理

一个账号&#xff0c;多台设备同时登陆的问题&#xff0c;设计以及实现 参考这篇文章&#xff1a; https://www.alibabacloud.com/help/zh/tair/use-cases/manage-multi-device-logon-from-a-single-user-by-using-tairhash1.0 设计思路 利用的是Redis&#xff0c;主设备的保…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API&#xff0c;让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API&#xff0c;你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...