2012-06-28 4 views
1

В couchdb можно определить карту и уменьшить функции в Javascript и отправить их через HTTP POST на сервер для определения представлений. Круто.Вы очищаете свою карту/уменьшаете функции перед подачей? Как?

Приложения определяют строковое представление соответствующих функций.

Я создаю приложение JS, которое подключается к couchdb, используя emacs, текстовый редактор. Это позволяет мне определить карту и уменьшить такие функции, как это:

var byname = function(doc) { 
    emit(doc.name,null); 
}; 

Это дает мне EMACS подсветку синтаксиса, JSLint проверки, и так далее.

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

doc = { views: { empty:   { map:stringRep(empty) }, 
                 byname: { map:stringRep(byname) }, 
                 invalid: { map:stringRep(invalid) }}}; 

// PUT that doc to couchdb here, to define the design_doc . 

Но строковые представления включают в себя новые строки, возврат каретки и т. д.

Я мог бы фильтровать их с помощью замены регулярных выражений, которая работает для простого случая. Но есть и более сложный случай прокомментированных строк в функции. Например:

var byname = function(doc) { 
    // a comment here 
    emit(doc.name,null); 
}; 

В этом случае stringRep будет включать в свой комментарий, но если я устранить строки и фиктивный пропуски, комментарии остаются. Я тоже мог бы заменить их, но могут быть и другие проблемы (не уверен).

Есть ли типичный или рекомендованный способ, чтобы люди санировали свои функции javascript перед отправкой их на couchdb?

ответ

0

Это то, что я в конечном итоге с помощью:

CouchDB.stringRep = function(fn) { 
    return fn.toString() 
     .replace(/[\s\t]*\/\/.*$/gm, '') // comments 
     .replace(/\n */gm, ' ') 
     .replace(/\r */gm, ' ') 
     .replace(/\{ +/gm, '{') 
     .replace(/ +\}/gm, '}'); 
}; 

И тогда я загрузить функции сериализовать таким образом, с такой HTTP сообщения:

PUT https://foo.cloudant.com/fop/_design/baseViews HTTP/1.1 
Accept: text/plain,application/json 
Accept-Language: en-us 
User-Agent: Mozilla/4.0 (compatible; Win32; WinHttp.WinHttpRequest.5) 
Content-Length: ... 
Host: foo.cloudant.com 

{"views":{"empty":{"map":"function(doc) {if (! doc.observation || doc.observation === '') {emit(doc.id, 1);}}"},...}} 
0

No.

Мы не только не чистят их, мы их в cofeescript в проектном файле, который получает вставленной в cake задачу, которая автоматически преобразует их в JS.

1

Нет, нет ничего особенного. Они интерпретируются/скомпилированы с помощью обычного механизма JavaScript (SpiderMonkey) и не нуждаются в предварительной обработке или очистке или что-то еще. Напишите их, как и любой другой скрипт.

Большинство практик, используемых в Интернете, имеют точно такое же значение или эффект - вы можете минимизировать все, что вы отправляете, если вам удастся отправить тысячи различных функций в БД и хотите сохранить пропускную способность; вы можете скомпилировать код с другого языка на JS и т. д. и т. д.

Смежные вопросы