【问题标题】:Error about 'invalid JSON' with couchDB view but the json's fine关于带有 couchDB 视图的“无效 JSON”的错误,但 json 很好
【发布时间】:2010-03-17 11:30:47
【问题描述】:

我正在尝试在 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 'PUT' 时:

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

我知道它不是无效的 JSON,因为我使用 Python 2.6 中内置的“json”库对其进行了测试,它可以正常加载。 JS 搞砸了给我错误“必须评估一个函数”

我用 od 检查了文件,没有隐藏的控制字符,我的系统设置为 UTF-8。我正在使用 CouchDB 0.10.1 版

还有什么问题?

【问题讨论】:

  • keys.json 是否可以使用 UTF-16 或 UCS-2 等 16 位编码进行编码?
  • 仅供参考,您的 JSON 在 Chrome、Internet Explorer 和 Firefox 中解析得很好。
  • @Joachim_Sauer 文件keys.json,显示为'ascii text',如果用'od -c'检查没有恐怖控制字符,我的系统默认为utf-8,我很困惑
  • curl -v 有帮助,因为它会转储发送到服务器的实际请求

标签: javascript views couchdb


【解决方案1】:

@titanoba 暗示了这个问题:

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

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

curl -X PUT -d @keys.json  $CDB/_design/id

【讨论】:

  • 我知道我只是忘记了。 拍脑袋
  • +1:那些不断给予和给予(并节省我时间)的答案之一。谢谢。
【解决方案2】:

可能需要将您的 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】:

    您最近是否从源代码更新了 CouchDB?如果是这样,请务必删除所有旧文件。

    【讨论】:

      【解决方案4】:

      原因

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

      行不通的是引号是由shell使用单引号对引号进行插值的。

      【讨论】:

        猜你喜欢
        • 2011-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-13
        • 2011-11-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多