Ошибка о 'неверном JSON' с представлением couchDB, но с json все в порядке - PullRequest
10 голосов
/ 17 марта 2010

Я пытаюсь настроить следующий вид на CouchDB

{
"_id":"_design/id",
"_rev":"1-9be2e55e05ac368da3047841f301203d",
"language":"javascript",
    "views":{ "by_id":{
              "map" : "function(doc) { emit(doc.id, doc)}"
        },"from_user_id":{
            "map" : "function(doc) { if (doc.from_user_id) {emit(doc.from_user_id, doc)}}"},
        "from_user":{
            "map" : "function(doc) { if (doc.from_user) {emit(doc.from_user, doc)}}"},
        "to_user_id":{
            "map" : "function(doc) {if (doc.to_user_id){ emit(doc.to_user_id, doc)}}"},
        "to_user":{
            "map" : "function(doc) {if (doc.to_user){ emit(doc.to_user, doc)}}" },
        "max_id":{
         "map" : "function(doc) { if (doc.id) {emit(doc._id, eval(doc.id))}}",  
         "reduce" :"function(key,value) { a = value[0]; for (i=1; i <value.length; ++i){a =    Math.max(a,value[i])} return a}"
        }
    }
}

когда я пытаюсь «положить» это, используя curl:

 curl -X PUT -d keys.json  $CDB/_design/id
 {"error":"bad_request","reason":"invalid UTF-8 JSON"}

Я знаю, что это не недействительный JSON, потому что я протестировал его с помощью библиотеки 'json', встроенной в Python 2.6, она отлично загружается. Оскорбления JS дают мне ошибку «должен вычислять функцию»

Я проверил файл с помощью od, скрытых контрольных символов нет, моя система настроена на UTF-8. Я использую CouchDB версии 0.10.1

Что еще может быть не так?

Ответы [ 4 ]

19 голосов
/ 17 марта 2010

@ Титаноба намекнул на проблему:

Опция -d для curl ожидает фактические данные в качестве аргумента!

Если вы хотите предоставить данные в файле, вам нужно добавить префикс @:

curl -X PUT -d @keys.json  $CDB/_design/id
4 голосов
/ 17 марта 2010

Может потребоваться поместить ваш JSON в одинарные кавычки:

curl -vX PUT http://localhost:5984/dbname/docid -d '{"foo" : "bar"}'

у меня работает но

curl -vX PUT http://localhost:5984/dbname/docid -d {"foo" : "bar"}

выдает ошибку, которую вы упомянули. Я предполагаю, что оболочка как-то мешает отправке данных, когда вы опускаете одинарные кавычки.

edit: я использую bash.

2 голосов
/ 18 марта 2010

Вы недавно обновили CouchDB из источника? Если это так, обязательно удалите все старые файлы.

0 голосов
/ 09 августа 2010

Причина

curl -vX PUT http://localhost:5984/dbname/docid -d {"foo" : "bar"}

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

...