使用节点js动态导出函数

时间:2014-07-21 12:24:02

标签: javascript node.js list export

我前几天开发了一个监视节点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 吗?

1 个答案:

答案 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(),执行修改后的代码,并获取导出的函数。