代码之家  ›  专栏  ›  技术社区  ›  Chris Huang-Leaver

couchdb视图出现“invalid json”错误,但json正常

  •  10
  • Chris Huang-Leaver  · 技术社区  · 16 年前

    我正在尝试在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 -X PUT -d keys.json  $CDB/_design/id
     {"error":"bad_request","reason":"invalid UTF-8 JSON"}
    

    我知道它不是无效的JSON,因为我使用Python2.6中内置的“JSON”库对它进行了测试,它可以很好地加载。JS错误提示“必须对函数进行评估”

    我已经用od检查了文件,没有隐藏的控制字符,我的系统设置为utf-8。我使用的是CouchDB版本0.10.1

    还有什么问题吗?

    4 回复  |  直到 15 年前
        1
  •  19
  •   Joachim Sauer    16 年前

    @Titanoba暗示了这个问题:

    这个 -d option of curl 期望实际数据作为参数!

    如果要在文件中提供数据,则需要在其前面加前缀 @ :

    curl -X PUT -d @keys.json  $CDB/_design/id
    
        2
  •  4
  •   titanoboa    16 年前

    可能需要将JSON放在单引号中:

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

    对我有用但是

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

    抛出您提到的错误。我猜,当省略单引号时,shell会以某种方式干扰您发送的数据。

    编辑:我用的是bash。

        3
  •  2
  •   Jan Lehnardt    16 年前

    最近有没有从源代码更新couchdb?如果是,请确保删除所有旧文件。

        4
  •  0
  •   bcolfer    15 年前

    原因

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

    不起作用的是,引号是由shell使用单引号插入的,而引号是由引号转义的。