Javascript 使用节点js动态导出函数
几天前,我开发了一个脚本来监视NodeJS应用程序。错误的是,我必须手动导出我想要监视的每个函数。例如,下面是我想要监控的一段代码:Javascript 使用节点js动态导出函数,javascript,node.js,list,export,Javascript,Node.js,List,Export,几天前,我开发了一个脚本来监视NodeJS应用程序。错误的是,我必须手动导出我想要监视的每个函数。例如,下面是我想要监控的一段代码: var express = require('express'); var app = express(); app.get('/', function(req, res){ res.setHeader('Content-Type', 'text/plain'); res.end('Home'); }); app.get('/login',
var express = require('express');
var app = express();
app.get('/', function(req, res){
res.setHeader('Content-Type', 'text/plain');
res.end('Home');
});
app.get('/login', function(req, res){
//On doit remplacer les appels de fonctions monitorées
//par le module.exports.fonction
//login(req,res);
exports.instrument_login(req, res)
});
function login(req, res){
res.setHeader('Content-Type', 'text/plain');
res.end('Page de login');
}
exports.instrument_login = login;
app.listen(1616);
我现在要做的就是导出登录功能。然后我的脚本将一些AOP关联到它,我将能够获得执行时间和吞吐量
但是,正如您所看到的,我必须使用exports.instrument\u login(req,res)而不是login(req,res)。通过直接列出应用程序脚本中的每个函数,然后将其与AOP函数关联,我可以避免这种代码替换。但话说回来,我就是搞不懂
是否可以执行某种循环来遍历应用程序脚本中的每个函数
像这样的事情:
Object.keys(object).sort(function( a, b ) {
return a.localeCompare( b );
}).forEach(function( element, index, array ) {
console.log(element);
});
但是如果你不想写
exports.foo=bar,你可以这样定义你的导出,而不是object,我会在节点JS中传递这个对象,它包装每个函数代码>行:
module.exports = {
instrument_login: function(req, res) {
res.setHeader('Content-Type', 'text/plain');
res.end('Page de login');
},
// other functions ...
};
如果您无法控制代码,则可以使用JS AST模块,例如(npm上还有许多其他模块提供类似的AST遍历功能)
这将允许您解析javascript并查找函数。那么仅仅附加exports就很简单了代码>脚本末尾的行。然后,如果希望能够require()
修改后的代码,您可以将结果保存到新文件或覆盖原始文件。否则,您可以使用模块模拟require()
,执行修改后的代码,并获取导出的函数。我愿意!问题是我不能:我想监视的不是我的应用程序,而函数的编码正如您在我的示例中看到的那样。另一件我不明白的事情(一定是我对JavaScript缺乏了解)是为什么intrument\u login和login具有相同的签名,但不被视为相同的函数?我不确定“相同的签名”是什么意思,您可以执行exports.login=login代码>。我已经更新了我的答案,如果你不能控制代码,我会自动添加答案。谢谢你提供关于JS AST的信息。尽管如此,如果我做一些像导出之类的事情代码>,然后我应用一些AOP如下:meld.around(导出,“functionName”,someFunction)
,被监控的功能将是导出。
,而不是导出。
,这意味着面向方面的编程,并在这里解释!!!!!!