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

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

新規登録して質問してみよう
ただいま回答率
85.48%
MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Q&A

0回答

334閲覧

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

aiai8976

総合スコア112

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

0グッド

0クリップ

投稿2019/08/31 06:07

編集2019/09/03 00:44

前提・実現したいこと

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問