javascript - node.js 可以像 CouchApp 那样执行从 CouchDB 中提取的 JavaScript 函数吗?如何?

标签 javascript couchdb node.js couchapp

快速概述是这样的:对于我的网络应用程序,我可以使用 CouchApp 和 CouchDB View 等编写我的大部分功能。我喜欢 CouchApp 的功能,它通过复制将我的代码推送到服务器 - 这使得部署周期很简单。

但是,要执行一些 couchdb 不支持的任意工作并解决一些限制,我需要在 CouchDB 前面放置一个 Web 平台。我正在考虑在 node.js 中构建它,因为它使用 JavaScript,我想继续使用将代码推送到数据库的简单部署方法。

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

那么问题来了,如何以文本形式获取其中包含JavaScript函数的子数据结构,并执行该函数?

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

所以,我想的是伪代码: Var string thecode = getValueForMapKey(handlerFunctionIWant); 以某种方式神奇地执行(代码)

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

最佳答案

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

你也可以在 Node 中使用它,就像这样,作为一个动态函数:

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,或者您可以要求其他库,这些库将被加载,就好像它是该范围内的匿名函数一样。

将其放入设计文档中,然后只有管理员可以立即进行更改。

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

// 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?

关于javascript - node.js 可以像 CouchApp 那样执行从 CouchDB 中提取的 JavaScript 函数吗?如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3721469/

相关文章:

javascript - 如何调试打不开的页面(空白页)

node.js - Sequelize .save() 在实例上不起作用

couchdb - 如何在 CouchDB 中编写 SELECT COUNT(DISTINCT field) 查询?

javascript - 在 Javascript 中获取查询字符串数组值

javascript - polymer JS : Does prepending an item to an Array property re-render the whole UI?

javascript - 比较 php 值与 javascript 变量?

javascript - CouchDB 列表函数抛出 TypeError(点未定义)

ruby-on-rails - Rails 中基于模型的 CouchDB 数据删除

node.js - Nest Js (Node Js Framework) - 如何使用 pm2 在 Digital Ocean 上启动服务器?

javascript - React Redux - 在 reducer 之间共享状态( reducer 层次结构)