node.js可以像CouchApp那样执行从CouchDB获取的JavaScript函数吗? 怎么样?

快速浏览是这样的:对于我的web应用程序,我可以使用CouchApp和CouchDB视图等来编写我的大部分function。我喜欢CouchApp的function,通过复制将我的代码推送到服务器 – 这使得部署周期非常简单。

但是,为了完成一些不受couchdb支持的任意工作,并且需要在CouchDB之前设置一个Web平台。 我正在考虑在node.js中构build它,因为它使用JavaScript,并且我想继续将代码推入数据库的简单部署方法。

下面是我想象它的工作原理: – 我使用常规方法和node命令在node.js中编写Web服务器/服务来启动它。 – 这个服务连接到沙发数据库,​​并获得虚拟列表和URL映射列表。 该列表存储在redis中用于快速查找。 这个列表将告诉服务器,当它获得一个请求时,基于主机和path等,哪个处理器将被运行。 – 服务器获取处理程序 – 这只是一个文档,它可能是一个devise文档或在couchdb中的任意json文档。 然后执行该处理程序来处理请求,就像我将处理程序写入节点js的一部分一样。

所以问题是,如何获得一个儿子数据结构,其中包含一个JavaScript函数,文本forms,并执行该function?

这可能是非常明显的,但我来自编译的背景,所以通常会有一个编译步骤,这使得这几乎是不可能的。

所以,我在想的是在伪代码:var string code = getValueForMapKey(handlerFunctionIWant); somehowmagicallyexecute(导出代码)

有没有一个执行或运行function,将在JavaScript中执行上述神奇的执行步骤?

eval(handlerFunctionIwant)是执行它的调用。 当然,您需要确保黑客无法将代码注入到该string中。

我不清楚这是否会在可访问其他javescript资源(如node.js的其余部分或访问您的couchdb库)的上下文中进行评估。

它将运行在node.js上下文中。

你也可以在节点中像这样使用它作为dynamic函数:

 var cradle = require('cradle'); var db = new(cradle.Connection)().database('db_name'); db.get('_design/node%2Fyour_code', function (err, doc) { if (!err){ var your_code = new Function(doc['arguments'].join(','), doc.code); your_code("cool", "also cool"); }else{ console.error('error:', err); } }); 

让你的文档看起来像这样:

 { "_id": "_design/node/your_code", "arguments": [ "nameOfArg1", "nameOfArg2" ], "code": "console.log('arg1', nameOfArg1); console.log('arg2', nameOfArg2);" } 

它与调用新函数的范围相同,因此您可以访问cradle,也可以要求其他库,这些库将被加载,就好像它是该范围内的anon函数一样。

把它放在一个devise文档,然后只有pipe理员可以做出改变,开箱即用。

这是一个更好的,但类似的方法:

 // Format, in db: doc = { "_id": "_design/node", "your_function_name": { "arguments": [ "nameOfArg1", "nameOfArg2" ], "code": "console.log('arg1', nameOfArg1); console.log('arg2', nameOfArg2);" }, "your_other_function_name": { "arguments": [ "name" ], "code": "console.log('hello', name, 'how\\'s it going, bro?');" } }; var cradle = require('cradle'); var db = new(cradle.Connection)().database('db_name'); function run_from_db(name, args){ db.get('_design/node', function (err, doc) { if (!err){ if (doc[name] !== undefined){ var fn = new Function(doc[name]['arguments'].join(','), doc[name].code); fn.apply(fn, args); }else{ console.error("could not find", name, "in _design/node"); } }else{ console.error(err); } }); } run_from_db('your_other_function_name', ['konsumer']); 

这将输出:

 hello konsumer how's it going, bro?