快速概述是这样的:对于我的Web应用程序,我可以使用CouchApp和CouchDB视图等编写我的大部分功能.我喜欢CouchApp的功能,它通过复制将我的代码推送到服务器 - 这使得部署周期非常容易.
但是,要做一些在couchdb中不支持的任意工作并解决一些限制,我需要在CouchDB前放置一个Web平台.我正在考虑在node.js中构建它,因为它使用JavaScript,我想继续将代码推送到数据库的简单部署方法.
以下是我想象它的工作方式: - 我使用普通方法和node命令在node.js中编写Web服务器/服务来启动它. - 此服务连接到沙发数据库并获取虚拟列表和URL映射列表.此列表存储在redis中以便快速查找.此列表将告知服务器何时获取请求,基于主机和路径等,运行哪个处理程序. - 服务器获取处理程序 - 它只是一个文档,它可以是设计文档或couchdb中的任意json文档.然后执行该处理程序来处理请求,就像我将处理程序写为节点js的一部分一样.
所以问题是,如何以文本形式获取包含JavaScript函数的子数据结构,并执行该函数?
这可能是非常明显的,但我来自编译后的背景,所以通常会有一个编译步骤,这使得这几乎不可能.
所以,我在想的是伪代码:Var string thecode = getValueForMapKey(handlerFunctionIWant); somehowmagicallyexecute(导出代码)
是否有一个exec或run函数可以在JavaScript中执行上面的魔术执行步骤?
它将在node.js上下文中运行.
你也可以在节点中使用它,就像这样一个动态函数:
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函数一样.
将它放在设计文档中,然后只有管理员才能进行更改,开箱即用.
这是一个更好但相似的方法:
// 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?