如何在 CouchDB 中找到错误请求的原因

How to find the reason for a bad request in CouchDB

我正在使用这样的 System.Net.WebClient 将文档批量上传到 CouchDB:

webClient.UploadString("couchdb.host.com:5984/db/_bulk_docs", "POST", json_data);

这通常工作正常,但有时我会收到状态为 'Bad Request' 的 WebException (400)。 不幸的是,这是我得到的唯一信息,所以我真的不知道是什么导致了异常。

我检查了 /var/log/couchdb/couchdb.log 下的日志文件,但我在那里没有得到任何进一步的信息:

[notice] 2019-09-10T15:26:09.173949Z couchdb@host.com <0.5318.568> f50ab02d22 host.com:5984 x.x.x.x undefined POST /db/_bulk_docs 400 ok 75

所以我的问题是:

我怀疑我要上传的文件太大了。我该如何检查?

更新:

我将错误请求转储到一个文件中:

        catch (WebException ex)
        {
            File.WriteAllText("C:\temp\couchdb_bad_request.json", json_data);
        }

并再次尝试:

curl -X POST http:/couchdb.host.com:5984/db/_bulk_docs -H "Content-Type: application/json" -d @couchdb_bad_request.json

这次我得到了一个201。那么curl和WebClient请求有什么区别呢?

我的 json 数据如下所示:

{
  "docs": [
    {
      "Type": "Image",
      "_attachments": {
        "123_original.jpg": {
          "content_type": "image/jpeg",
          "data": "<base64-encoded image data>"
        }
      },
      "ID": "123",
      "_id": "123",
      "FileName": "some_file.jpg",
      "AttachmentMetaData": {
        "original": {
          "Width": 864,
          "Height": 576,
          "MD5Checksum": "a20ecae8e3a7df8cc8558a71efc2b573"
        }
      }
    },
    {...}
  ]
}

根据你的问题信息,肯定是请求数据在某个地方出错了。由于有些请求可以,有些则不行,这可能是由于编码问题。

您可能需要查看 CouchDB 的响应,其中通常会提到编码问题。

阅读回复:

catch ( WebException exception )
{
   string responseText;

   using(var reader = new StreamReader(exception.Response.GetResponseStream()))
   {
     responseText = reader.ReadToEnd();
   }
}

在节点上,您可以使用await error.json()

读取异常响应
try {
  await request();
} catch(error) {
  console.log(await error.json());
}