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

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

ただいまの
回答率

89.08%

Node.jsでMongoDBにアクセスできない

解決済

回答 1

投稿 編集

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

aiai8976

score 58

前提・実現したいこと

現在、Node.jsをwebサーバとして、クライアントからアクセスがあった時に色々な処理を行うようなプログラムを作成しています。
その一つとしてMongoDBにアクセスし、必要な値を取得する処理があるのですが、うまくアクセスできません。
何か改善点があればコメントよろしくお願いします。

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

$ sudo node webServer.js
Server running at http://localhost:80/
/
/js/three.js-master/build/three.min.js
/js/OrbitControls.js
/get_value
レスポンス
[]
_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. Received type object
    at write_ (_http_outgoing.js:595:11)
    at ServerResponse.write (_http_outgoing.js:567:10)
    at Object.getValue (/home/hasegawa/デスクトップ/akiyama/Node.js/webServer.js:104:17)
    at Server.<anonymous> (/home/hasegawa/デスクトップ/akiyama/Node.js/webServer.js:128:29)
    at Server.emit (events.js:198:13)
    at parserOnIncoming (_http_server.js:677:12)
    at HTTPParser.parserOnHeadersComplete (_http_common.js:109:17)


「connected successfully」がうまく表示されずに次のログである「レスポンス」が表示されてしまいます。

該当のソースコード

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

// http.createServerがrequestされたら、(イベントハンドラ)
server.on('request', function (req, res) {
    // Responseオブジェクトを作成し、その中に必要な処理を書いていき、条件によって対応させる
    var Response = {
        "renderHTML": function () {
            var template = fs.readFile('./template/index.html', 'utf-8', function (err, data) {
                // HTTPレスポンスヘッダを出力する
                res.writeHead(200, {
                    'content-Type': 'text/html'
                });

                // HTTPレスポンスボディを出力する
                res.write(data);
                res.end();

            });

        },
        "getThree": function () {
            var template = fs.readFile('./js/three.js-master/build/three.min.js', 'utf-8', function (err, data) {
                // HTTPレスポンスヘッダを出力する
                res.writeHead(200, {
                    'content-Type': 'text/javascript'
                });

                // HTTPレスポンスボディを出力する
                res.write(data);
                res.end();
            });
         },
         "getOrbit": function () {
            var template = fs.readFile('./js/OrbitControls.js', 'utf-8', function (err, data) {
                 // HTTPレスポンスヘッダを出力する
                 res.writeHead(200, {
                     'content-Type': 'text/javascript'
                 });

                 // HTTPレスポンスボディを出力する
                 res.write(data);
                 res.end();
             });
          },
          "getValue": function () {
            const MongoClient = require("mongodb").MongoClient;

            // 接続文字列
            const url = 'mongodb://localhost:27017';
            const dbName='study';
            const assert=require('assert')
            var result=new Array();

            // MongoDB へ 接続
            MongoClient.connect(url, function(err, client){
              assert.equal(null,err);
              console.log("Connected successfully to server");

              const db=client.db(dbName);

              findDocuments(db,function() {
                client.close();
              });

              // コレクション中で条件に合致するドキュメントを取得
              // collection.find({price: {$lt: 2000}}).toArray((error, documents)=>{
              //   for (var document of documents) {
              //     console.log(document.name);
              //   }
              // });
              db.close();
            });

            const findDocuments=function(db,callback) {

              // コレクションの取得
              const collection = db.collection("user");

              // コレクションに含まれるドキュメントをすべて取得
              collection.find({}).toArray(function(err, documents) {
                assert.equal(err,null)              
                for (var document of documents) {
                  console.log("Found the following records")
                  result=push(document.dist);
                  result=push(document.rot);
                }
                callback(documents);
              });
            }

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

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

            // HTTPレスポンスボディを出力する
            res.write(result);
            res.end();
           }
  };
    // urlのpathをuriに代入
    var uri = url.parse(req.url).pathname;
    console.log(uri);


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

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

試したこと

ここに問題に対して試したことを記載してください。

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

mongo:4.0.10
OS:Ubuntu

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

mongoモジュールのバージョンによって引数変わるようです。参考にした書籍もしくはサイトと、実際に使っているmongoのバージョンは合ってますか?
以下の箇所のみ抜粋して、コンソール上で直接コマンド打ってエラーが出るようならお使いのmongoに合うように修正しましょう

 MongoClient.connect(url, (error, db) => {
              var collection;
              console.log("はいった!!!!!");


              // コレクションの取得
              collection = db.collection("user");

              // コレクションに含まれるドキュメントをすべて取得
              collection.find().toArray((error, documents) => {

                for (var document of documents) {
                  console.log(document.dist);
                  console.log(document.rot);
                  result=push(document.dist);
                  result=push(document.rot);
                }
              });

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/30 21:01

    コメントありがとうございます。
    指摘通りバージョンは違っていました。
    しかし、v4の書き方が調べてみても特に変更が内容に思われます。

    キャンセル

  • 2019/07/30 22:40

    v4をどこで手に入れたのか分からないけど、一応入ってるモジュールの再確認をしてそれに適したマニュアルを確認した方が良いと思います
    https://mongodb.github.io/node-mongodb-native/3.2/

    キャンセル

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

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

関連した質問

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