node.js能否像CouchApp那样执行从CouchDB提取的JavaScript函数?怎么用?

node.js能否像CouchApp那样执行从CouchDB提取的JavaScript函数?怎么用?,javascript,couchdb,node.js,couchapp,Javascript,Couchdb,Node.js,Couchapp,快速概述如下:对于我的web应用程序,我可以使用CouchApp和CouchDB视图等编写大部分功能。我喜欢CouchApp的功能,它通过复制将我的代码推送到服务器—这使得部署周期非常简单 然而,要做一些couchdb不支持的任意工作并绕过一些限制,我需要在couchdb前面放置一个web平台。我正在考虑在node.js中构建它,因为它使用JavaScript,并且我希望继续将代码推送到数据库中的简单部署方法 以下是我对其工作原理的想象: -我使用普通方法和node命令在node.js中编写了一

快速概述如下:对于我的web应用程序,我可以使用CouchApp和CouchDB视图等编写大部分功能。我喜欢CouchApp的功能,它通过复制将我的代码推送到服务器—这使得部署周期非常简单

然而,要做一些couchdb不支持的任意工作并绕过一些限制,我需要在couchdb前面放置一个web平台。我正在考虑在node.js中构建它,因为它使用JavaScript,并且我希望继续将代码推送到数据库中的简单部署方法

以下是我对其工作原理的想象: -我使用普通方法和node命令在node.js中编写了一个web服务器/服务来启动它。 -该服务连接到coach数据库并获取虚拟列表和URL映射列表。此列表存储在redis中,以便快速查找。当服务器收到请求时,该列表将根据主机和路径等告诉服务器要运行哪个处理程序。 -服务器获取处理程序——它只是一个文档,可以是设计文档,也可以是couchdb中的任意json文档。然后执行该处理程序来处理请求,就像我将该处理程序作为节点js的一部分编写一样

所以问题是,如何获得一个包含JavaScript函数的son数据结构,以文本形式,并执行该函数

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

所以,我想的是伪代码: 变量字符串thecode=getValueForMapKey(handlerFunctionIWant); 如何神奇地执行(代码)

是否有exec或run函数可以在JavaScript中执行上述神奇的执行步骤

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


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

它将在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);"
}
它与调用新函数的位置在同一范围内,因此您可以访问摇篮,或者您可以要求其他lib,这些lib将被加载,就像它是该范围内的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?

有趣的想法——动态地从couchdb中提取代码——你有没有这样做过?我见过人们成功地做到了这一点。使用此技术,您可以同时部署CouchDB和Node.js升级。通常,如果javascript没有更改,您可以将代码放入_attachments/script中,并使用
加载它。如果它发生变化,您可以创建一个普通文档(在设计文档之外),并使用脚本标记获取它。要实现动态,您可以加载多个文件并只执行所需的一个文件。如果必须的话,只做ajax、eval、db.get等。