1

ローカルの CouchDB インスタンスの一括ドキュメント API に多数のレコードを投稿しようとしているノード コンソール アプリがあり、「無効な UTF-8 JSON」を取得しています。これを特に奇妙にしているのは、オブジェクト リテラルで JSON.stringify を使用して JSON を生成していることです。

http://jsonlint.com/で実際の json をテストしましたが、有効であると思われます。ディレクトリからの名前と番号であるため、完全な json をここに投稿することはできませんが、基本的な構造を示すモック レコードを表示できます。

{
 "family" : "Smith",
        "people":{
            "Bob":{
                 "name":"Bob", 
                 "active" : true,
                "birthday" : "1/01"
            },
            "Sue":{
                "name": "Sue", 
                "active" : true,
                "birthday" : "1/01"
            }
        },
        "address": {
            "street" :"1111 Cool Road",
            "city" : "Cincinnati",
            "state" : "OH",
            "zip" : "11111"
        },
        "phone" : "923-4908"            
};

ここで指定されているように、プロパティ「docs」を使用して、レコードの配列をjsonオブジェクトにラップしました。私がやろうとしていることは明らかに間違っていますか?

更新: lambmj の提案に従って、ノードによって生成された文字列をファイルに書き込み、curl を使用してそれを一括ドキュメント アップロードに投稿しました。それは完璧に機能しました。ただし、ノード内から機能するように、ノードコードの修正を誰かに手伝ってもらいたいと思っています。リクエストをビルドして投稿する正確なコードは次のとおりです

  //The result variable is my array of 'family' objects, 
  //It's generated by parsing a text file, not show here
  var postOptions = {
  host: 'localhost',
  port: '5984',
  path: '/members/_bulk_docs',
  method: 'POST',
  headers: {
      'Content-Type': 'application/json',
      'Content-Length': result.length
  }
};
var request = http.request(postOptions, function(res){
    res.setEncoding('utf8');
    res.on('data', function (chunk) {
      console.log('Response: ' + chunk);
    });
});
var body = { "docs": result};
var stringData = JSON.stringify(body);
console.log(stringData);
request.write(stringData);
4

1 に答える 1

4

次のコマンドを使用して、例を機能させることができました。

curl -X POST -H "Content-type:application/json" \
    http://localhost:5984/test/_bulk_docs -d @family.json

wherefamily.jsonには以下が含まれます。配列に複数の要素が存在するように、2 番目のファミリを追加しました。

{"docs": [
  {"family" : "Smith",
    "people":{
        "Bob":{
             "name":"Bob", 
             "active" : true,
            "birthday" : "1/01"
        },
        "Sue":{
            "name": "Sue", 
            "active" : true,
            "birthday" : "1/01"
        }
    },
    "address": {
        "street" :"1111 Cool Road",
        "city" : "Cincinnati",
        "state" : "OH",
        "zip" : "11111"
    },
    "phone" : "923-4908"
  },
  {"family" : "Jones",
    "people":{
        "John":{
             "name":"John",
             "active" : true,
            "birthday" : "1/01"
        },
        "Mary":{
            "name": "Mary",
            "active" : true,
            "birthday" : "1/01"
        }
    },
    "address": {
        "street" :"1112 Cool Road",
        "city" : "Cincinnati",
        "state" : "OH",
        "zip" : "11111"
    },
    "phone" : "923-4909"
  }
]}

docsJSON は、配列にラップされ、 CouchDB に渡される JSON の属性の値として提供されるものと同じです。また、指定した例には末尾のセミコロン ( ;) があります。他のすべてが正しくフォーマットされている場合、それが問題になる可能性があります。

アップデート:

OK、これが回答ノードのコードです。コードに記載されているように、3 つの変更を加えました。

#!/usr/bin/env node

var http = require("http");

// Embedding the family object here so that this test program will compile/run.

result = {
     "family" : "Smith",
            "people":{
                "Bob":{
                     "name":"Bob",
                     "active" : true,
                    "birthday" : "1/01"
                },
                "Sue":{
                    "name": "Sue",
                    "active" : true,
                    "birthday" : "1/01"
                }
            },
            "address": {
                "street" :"1111 Cool Road",
                "city" : "Cincinnati",
                "state" : "OH",
                "zip" : "11111"
            },
            "phone" : "923-4908"        
    };

var body = { "docs": [result]};                 // Change #1: docs takes an array.

var stringData = JSON.stringify(body);          // Change #2: stringify first.

var postOptions = {
  host: 'localhost',
  port: '5984',
  path: '/members/_bulk_docs',
  method: 'POST',
  headers: {
      'Content-Type': 'application/json',
      'Content-Length': stringData.length       // Change #3: send the length of the stringified data.
  }
};

var request = http.request(postOptions, function(res){
    res.setEncoding('utf8');
    res.on('data', function (chunk) {
      console.log('Response: ' + chunk);
    });
});

console.log(stringData);

request.write(stringData);

request.end();

ノードから取得した出力は次のとおりです。

{"docs":[{"family":"Smith","people":{"Bob":{"name":"Bob","active":true,"birthday":"1/01"},"Sue":{"name":"Sue","active":true,"birthday":"1/01"}},"address":{"street":"1111 Cool Road","city":"Cincinnati","state":"OH","zip":"11111"},"phone":"923-4908"}]}

Response: [{"ok":true,"id":"721b8cde7a1e22b4cc106adbb3f41df9","rev":"1-306b71ff83df48c588a174fd5feafa34"}]
于 2012-11-01T15:00:22.703 に答える