用node js动态导出函数

Dynamically exports functions with node js

本文关键字:函数 动态 node js      更新时间:2023-09-26

几天前我开发了一个脚本来监控node 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与它关联起来,我将能够获得执行时间和吞吐量。

但是,如您所见,我必须使用导出。将login(req, res)替换为instrument_login(req, res)通过直接列出应用程序脚本中的每个函数,然后将其关联到AOP函数,我可以避免这种代码替换。但是,我就是想不明白。

是否有可能做某种循环去通过每个函数在应用程序脚本?

像这样:

Object.keys(object).sort(function( a, b ) {
        return a.localeCompare( b );
    }).forEach(function( element, index, array ) {
        console.log(element);
    });

但是,而不是对象我会传递对象在Node JS包装每个函数?

如果您想要避免编写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(),执行修改后的代码,并获得导出的函数。