Может ли node.js выполнять функции JavaScript, извлеченные из CouchDB, как это делает CouchApp? Как? - PullRequest
4 голосов
/ 16 сентября 2010

Краткий обзор таков: для своего веб-приложения я могу написать большую часть своей функциональности, используя представления CouchApp и CouchDB и т. Д. Мне нравится функция CouchApp, которая передает мой код на сервер посредством репликации - это делает цикл развертывания очень просто.

Однако, чтобы выполнить произвольную работу, не поддерживаемую в couchdb и обходящую некоторые ограничения, мне нужно поместить веб-платформу перед CouchDB. Я рассматриваю возможность создания этого в файле node.js, потому что он использует JavaScript, и я хочу продолжить простой способ развертывания, вставляя код в базу данных.

Вот как я представляю, как это работает: - Я пишу веб-сервер / сервис в node.js, используя обычный метод и команду узла, чтобы запустить его. - этот сервис подключается к couch db и получает виртуальный список и список отображения URL. Этот список хранится в Redis для быстрого поиска. Этот список сообщит серверу, когда он получит запрос, в зависимости от хоста, пути и т. Д., Какой обработчик должен быть запущен. - сервер извлекает обработчик - это просто документ, это может быть документ проекта или произвольный документ json в couchdb. И затем выполняет этот обработчик для обработки запроса, как если бы я написал обработчик как часть узла js.

Итак, вопрос в том, как получить структуру данных сына, содержащую функцию JavaScript, в текстовом виде, и выполнить эту функцию?

Это может быть ослепительно очевидно, но я пришел из скомпилированного фона, поэтому обычно здесь есть шаг компиляции, который делает это почти невозможным.

Итак, я думаю о псевдокоде: Переменная строка thecode = getValueForMapKey (handlerFunctionIWant); somehowmagicallyexecute (thecode)

Существует ли функция exec или run, которая будет выполнять магический шаг выполнения выше в JavaScript?

Ответы [ 2 ]

11 голосов
/ 01 февраля 2012

Он будет работать в контексте 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);"
}

Он находится в той же области, в которой вызывается новая функция, поэтому у вас есть доступ к колыбели или вам могут потребоваться другие библиотеки, которые будут загружены, как если бы это была функция 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?
0 голосов
/ 16 сентября 2010

eval (handlerFunctionIwant) - это вызов для его выполнения. Конечно, вы должны убедиться, что у хакеров нет способа внедрить код в эту строку.

Мне не ясно, будет ли это оцениваться в контексте, который имеет доступ к другим ресурсам javescript, таким как остальная часть node.js или доступ к вашей библиотеке couchdb.

...