質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.49%

collection.find()を実行する場所を変えるとうまくいかない

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 473

score 100

前提・実現したいこと 

mongodbから指定のデータを取ってくる処理をNode.jsで作成しています。待ち状態になるまでにその処理を実行しておくと成功するのですが、getValueのなかで実行させるとこの処理を飛ばして次に進んでしまいます。
なぜこのようなことになるのでしょうか。
また、postDataの方でもcolletionを使ってinsertしているのですが、そちらは普通に成功します。
理由と改善策がわかる方がいましたらコメントお願いします。

発生している問題・エラーメッセージ

想定だと/get_valueとレスポンスのあいだに「はいった」と出るはずですが、うまく入ってくれません。

$ node webServer.js
Server running 
Connected correctly to server
/
/js/three.js-master/build/three.min.js
/js/OrbitControls.js
/get_value
レスポンス
undefined
_http_outgoing.js:595
    throw new ERR_INVALID_ARG_TYPE('first argument',
    ^

TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be one of type string or Buffer. 

該当のソースコード

// 必要なファイルを読み込み
var http = require('http');
var url = require('url');
var fs = require('fs');
var server = http.createServer();


//DB接続準備
const MongoClient = require('mongodb').MongoClient;
const url_db = 'mongodb://localhost:27017'; // Connection URL
const dbName = 'study'; // Database Name
const client = new MongoClient(url_db, { useNewUrlParser: true });
const assert = require('assert');
var collection;
var value;


//省略

// Use connect method to connect to the server
client.connect(function (err) {
    assert.equal(null, err);
    console.log("Connected correctly to server");

    const db = client.db(dbName);

    // Get the documents collection
    collection = db.collection('user');

     //今回問題となっている箇所
   ///////////////////////////////////////////////////////
    collection.find({}).sort({time: -1}).toArray(function (err, docs) {
        console.log("はいった");
        for (var doc of docs){
            value = doc;
            break;
        }
    });
    /////////////////////////////////////////////////////////
});


// http.createServerがrequestされたら、(イベントハンドラ)
server.on('request', function (req, res) {
    // Responseオブジェクトを作成し、その中に必要な処理を書いていき、条件によって対応させる
    var Response = {
       //省略
        "getValue": function () {

         //////////////////////////////////////////////////
           ここに上のプログラムをいれると上のようなエラーが発生します
           //////////////////////////////////////////////////

            // HTTPレスポンスヘッダを出力する
            res.writeHead(200, {
                'content-Type': 'text/html',
                'Access-Control-Allow-Origin': '*'
            });

            console.log("レスポンス");
            //console.log(result);

            console.log(value);
            // HTTPレスポンスボディを出力する
            res.write(JSON.stringify(value));
            res.end();
        },
        "postData": function () {
            req.on('data', function (data) {
                data_string += data.toString('utf-8', 0, data.length); //バッファをstringに逐一変換
            });
            req.on('end', function () {
                var data_json = JSON.parse(data_string); //stringをjsonに変換
                //console.log(data_json.rot);


                //jsonにタイムスタンプを追加(あとで最新の物を検索して取り出せるように)
                var time=new Date().getTime();
                data_json["time"] = time;
                console.log(data_json.time);


                //ここのcollecitonはうまくいく
          /////////////////////////////////////////////////
                //データをDBに保存
                collection.insertOne(data_json);
                console.log('json data insert DB');
            });
        }
    };
    // urlのpathをuriに代入
    var uri = url.parse(req.url).pathname;
    console.log(uri);


    // URIで行う処理を分岐させる
    if (uri === "/") {
        // URLが「IPアドレス/:1234/」の場合、"renderHTML"の処理を行う
        Response["renderHTML"]();
        return;
    } else if (uri === "/js/three.js-master/build/three.min.js") {
        // URLが「IPアドレス/:1234/js/three.js-master/build/three.min.js」の場合、"getThree"の処理を行う
        Response["getThree"]();
        return;
    } else if (uri === "/js/OrbitControls.js") {
        // URLが「IPアドレス/:1234/js/OrbitControls.js」の場合、"getOrbit"の処理を行う
        Response["getOrbit"]();
        return;
    } else if (uri === "/get_value") {
        // URLが「IPアドレス/:1234/get_value」の場合、"getThree"の処理を行う
        Response["getValue"]();
        return;
    } else if (uri === "/post_data") {
        // URLが「IPアドレス/:1234/post_data」の場合、"postData"の処理を行う
        Response["postData"]();
    };
});

// 指定されたポート(1234)でコネクションの受け入れを開始する
server.listen(1234);
console.log('Server running ');

補足情報(FW/ツールのバージョンなど)

os:ubuntu

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る