我前几天开发了一个监视节点js应用程序的脚本。它的错误在于我必须手动导出我要监视的每个函数。例如,这是我要监视的一段代码:
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_login(req,res)而不是登录(req,res)。通过直接列出app-script中的每个函数,然后将它与AOP函数相关联,我将能够避免这种代码替换。但话说回来,我无法理解。
是否可以通过某种循环来遍历app-script中的每个函数?
像这样:
Object.keys(object).sort(function( a, b ) {
return a.localeCompare( b );
}).forEach(function( element, index, array ) {
console.log(element);
});
但是我会在Node JS中传递包含每个函数的对象而不是 object 吗?
答案 0 :(得分:0)
如果您想避免编写exports.foo = bar;
行,您可以定义这样的导出:
module.exports = {
instrument_login: function(req, res) {
res.setHeader('Content-Type', 'text/plain');
res.end('Page de login');
},
// other functions ...
};
如果您无法控制代码,可以使用JS AST模块,例如esprima(npm上有许多其他提供类似AST遍历功能的模块)。
这将允许您解析javascript并查找函数。然后,只需将exports.<functionName> = <functionName>;
行附加到脚本的末尾即可。然后,如果您希望能够require()
修改后的代码,则可以将结果保存到新文件或覆盖原始文件。否则,您可以使用vm模块模拟require()
,执行修改后的代码,并获取导出的函数。