Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用节点js动态导出函数_Javascript_Node.js_List_Export - Fatal编程技术网

Javascript 使用节点js动态导出函数

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',

几天前,我开发了一个脚本来监视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', 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)
,被监控的功能将是导出。
,而不是导出。
,这意味着面向方面的编程,并在这里解释!!!!!!