8

Wundground から API を介して JSON 形式の気象データを問題なく取得しています。後で使用するために、そのデータを MongoDB に保存しようとしています。実際にデータを取得し、Mongo のコレクションに書き込むことができます。ただし、db.collection.find() を実行すると、JSON 形式ではなく、個々の文字が個別に保存されているように見えます。データを取得して Mongo に保存するコード スニペットを次に示します。

// Define the Wunderground method.
var method = "/api/" + apiKey + "/conditions/q/" + state + "/" + city + ".json";

// Define the HTTP post properties.
var options = {
  host: 'api.wunderground.com',
  path: method,
  method: 'GET',
  port: 80
};

// Create the HTTP POST.
var request = http.request(options, function (response) {
  var str = '';

  // Create the listener for data being returned.
  response.on('data', function (chunk) {
    str += chunk;


    // Create the listener for the end of the POST.
    response.on('end', function (){
      db.collection('weathercollection').save(str, function(err, records) {
        if (err) throw err;
        console.log("record added");
      });
    });

JSON 形式の気象データの抜粋:

{ "current_observation": {
    "image": {
    "url": "http://icons-ak.com/graphics/logo.png",
    "title": "Weather Underground"
    },
    "display_location": {
    "full":"My City, State",
    "city":"My City",

Mongo に保存する前にデータを解析する必要はありませんか? それで、私は何が欠けていますか。私が言ったように、すべての気象データを完全にコンソールに出力すると、Node.JS と MongoDB の間で何か間違ったことをしているように見えます。

ありがとう。

アップデート***

この方法で「str」を解析しようとしました

// Create the listener for data being returned.
response.on('data', function (chunk) {
str += chunk;

var jsonResult = JSON.parse(str);

// Create the listener for the end of the POST.
response.on('end', function (){
  db.collection('weathercollection').save(jsonResult, function(err, records) {
    if (err) throw err;
    console.log("record added");`

それもうまくいかなかったようです。もう一度見てみます。

4

2 に答える 2

13

sendはい、関数に JavaScript オブジェクトを指定する必要があります (使用しているように見えるMongoDB ネイティブ ドライバーのドキュメントdataを参照) が、文字列を送信します (これが、各イベントで連結できる理由です)。を使用して、文字列を完全なオブジェクトに変換する必要がありますJSON.parse(str)

扱っているデータ型を確認したい場合は、 と の結果を出力typeof strしてtypeof JSON.parse(str)ください。

編集:コードに2番目の問題があります。responseオブジェクトは実際にはstream です。つまり、受信時にデータを送信します。dataこれは、イベントを複数回受信できることも意味します。これが、次のことが必要な理由です。

  1. 空の文字列を作成する
  2. dataイベントで、受け取ったばかりのチャンクを文字列に連結します
  3. それ以上データを受信しないことが確実な場合にのみ、最後に解析してください。

あなたが提供した更新されたコード スニペットでは、最初のデータ イベントで文字列を解析しようとしましたが、それは不完全な文字列である可能性があります。

これを達成する正しい方法は次のとおりです。

var str = '';
response.on('data', function(chunk) {
  str += chunk;
});
response.on('end', function() {
  var myObject = JSON.parse(str);
  // Send the Mongo query here
});

この問題に関連して、イベントにリスナーも登録しましたがend、これは良いことですが、各dataイベントに新しいリスナーを追加しました! つまり、5 つのデータ イベントを受け取った場合、オブジェクトを MongoDB に追加する関数を 5 回呼び出すことになります… 上記のスニペットでは、コールバックresponse.on('end', function() {…})の外側にを移動したことに注意してください。response.on('data')

于 2013-11-07T21:03:10.740 に答える
0
var MongoClient = require('mongodb').MongoClient, format = require('util').format;

MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err,db) {

    if (err) throw err;
    console.log("Connected to Database");
    var document = {name:"David", title:"About MongoDB"};

    // insert record
    db.collection('test').insert(document, function(err, records) {
        if (err) throw err;
        console.log("Record added as " + records[0]._id);
    });
});

参照元: http://code.runnable.com/UW3ef2Tkq498AABE/insert-a-record-in-mongodb-using-mongodb-native-for-node-js

于 2016-07-21T09:36:39.200 に答える