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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Node.js

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

Q&A

解決済

2回答

11427閲覧

The first argument must be one of type string or Buffer.

aiai8976

総合スコア112

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Node.js

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

0グッド

0クリップ

投稿2019/08/17 00:49

編集2019/08/17 00:51

前提・実現したいこと

Node.jsをwebサーバとして、MongoDBから取得したデータをクライアントにレスポンスとして返したいのですが、以下のようなエラーが発生しています。
MongoDBからのデータをJSON形式で取得できていることはログからも確認済みです。
何か解決策がありましたらコメントお願いします。

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

hasegawa@hasegawa-W76OC:~/デスクトップ/akiyama/Node.js$ sudo node webServer.js Server running at http://localhost:80/ Connected correctly to server / /js/three.js-master/build/three.min.js /js/OrbitControls.js /get_value レスポンス [ { _id: 5d5364026ed8a1d78076d1f4, dist: [ 456, 442, //省略 461, ... 1900 more items ], rot: [ 0.05797865190578781, 0.14626504446713978, //省略 19.726678416929172, ... 1900 more items ] } ] _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:107:17) at Server.<anonymous> (/home/hasegawa/デスクトップ/akiyama/Node.js/webServer.js:131:29) at Server.emit (events.js:198:13) at parserOnIncoming (_http_server.js:677:12) at HTTPParser.parserOnHeadersComplete (_http_common.js:109:17)

該当のソースコード

webserver.js(getValueが該当するコード)

webserver.js

1// 必要なファイルを読み込み 2var http = require('http'); 3var url = require('url'); 4var fs = require('fs'); 5var server = http.createServer(); 6 7const MongoClient = require('mongodb').MongoClient; 8// Connection URL 9 const url_db = 'mongodb://localhost:27017'; 10// Database Name 11const dbName = 'study'; 12const client = new MongoClient(url_db,{useNewUrlParser: true}); 13const assert = require('assert'); 14var collection; 15var value; 16 17// Use connect method to connect to the server 18client.connect(function(err) { 19 assert.equal(null, err); 20 console.log("Connected correctly to server"); 21 22 const db = client.db(dbName); 23 24 // Get the documents collection 25 collection = db.collection('user'); 26 27 collection.find({}).toArray(function(err, docs) { 28 //assert.equal(err, null); 29 //console.log("Found the following records"); 30 value=docs; 31 //console.log(value); 32 //callback(docs); 33 }); 34}); 35 36 37// http.createServerがrequestされたら、(イベントハンドラ) 38server.on('request', function (req, res) { 39 // Responseオブジェクトを作成し、その中に必要な処理を書いていき、条件によって対応させる 40 var Response = { 41 "renderHTML": function () { 42 var template = fs.readFile('./template/index.html', 'utf-8', function (err, data) { 43 // HTTPレスポンスヘッダを出力する 44 res.writeHead(200, { 45 'content-Type': 'text/html' 46 }); 47 48 // HTTPレスポンスボディを出力する 49 res.write(data); 50 res.end(); 51 52 }); 53 54 }, 55 "getThree": function () { 56 var template = fs.readFile('./js/three.js-master/build/three.min.js', 'utf-8', function (err, data) { 57 // HTTPレスポンスヘッダを出力する 58 res.writeHead(200, { 59 'content-Type': 'text/javascript' 60 }); 61 62 // HTTPレスポンスボディを出力する 63 res.write(data); 64 res.end(); 65 }); 66 }, 67 "getOrbit": function () { 68 var template = fs.readFile('./js/OrbitControls.js', 'utf-8', function (err, data) { 69 // HTTPレスポンスヘッダを出力する 70 res.writeHead(200, { 71 'content-Type': 'text/javascript' 72 }); 73 74 // HTTPレスポンスボディを出力する 75 res.write(data); 76 res.end(); 77 }); 78 }, 79 "getValue": function () { 80 //結果 81 // var value; 82 83 // Find some documents 84 /*collection.find({}).toArray(function(err, docs) { 85 //assert.equal(err, null); 86 //console.log("Found the following records"); 87 value=docs; 88 console.log(value); 89 callback(docs); 90 });*/ 91 /*value=collection.find(); 92 console.log(value);*/ 93 94 client.close(); 95 96 // HTTPレスポンスヘッダを出力する 97 res.writeHead(200, { 98 'content-Type': 'text/html', 99 'Access-Control-Allow-Origin': '*' 100 }); 101 102 console.log("レスポンス"); 103 //console.log(result); 104 105 console.log(value); 106 // HTTPレスポンスボディを出力する 107 res.write(value); 108 res.end(); 109 } 110 }; 111 // urlのpathをuriに代入 112 var uri = url.parse(req.url).pathname; 113 console.log(uri); 114 115 116 // URIで行う処理を分岐させる 117 if (uri === "/") { 118 // URLが「http://localhost:8080/」の場合、"renderHTML"の処理を行う 119 Response["renderHTML"](); 120 return; 121 } else if (uri === "/js/three.js-master/build/three.min.js") { 122 // URLが「http://localhost:8080/js/three.js-master/build/three.min.js」の場合、"getThree"の処理を行う 123 Response["getThree"](); 124 return; 125 } else if (uri === "/js/OrbitControls.js") { 126 // URLが「http://localhost:8080/js/OrbitControls.js」の場合、"getOrbit"の処理を行う 127 Response["getOrbit"](); 128 return; 129 } else if (uri === "/get_value") { 130 // URLが「http://localhost:8080/get_value」の場合、"getThree"の処理を行う 131 Response["getValue"](); 132 return; 133 }; 134 }); 135 136 // 指定されたポート(8080)でコネクションの受け入れを開始する 137 server.listen(1234); 138 console.log('Server running at http://localhost:80/'); 139

index.html

index.html

1<html> 2<head> 3 <script type="text/javascript" src="js/three.js-master/build/three.min.js"></script> 4 <script type="text/javascript" src="js/OrbitControls.js"></script> 5</head> 6 7<body> 8 <div id="WebGL-area"></div> 9 10 <script type="text/javascript"> 11 function getValue() { 12 //promiseを使うことで簡潔に記述できる 13 return new Promise((resolve, reject) => { //resolveまたはrejectの結果を返す 14 var req = new XMLHttpRequest(); // HTTPでファイルを読み込むためのXMLHttpRrequestオブジェクトを生成、サーバと非同期通信するためのAPI 15 req.open("get", "http://****:1234/get_value", true); 16 //req.setRequestHeader("Access-Control-Allow-Origin", "*"); 17 //受信が成功した時に呼び出されるイベント 18 req.onload = () => { 19 //通信が正常に終了したかを確認する 20 if (req.readyState === 4 && req.status === 200) { 21 console.log(req.readyState); 22 console.log(req.status); 23 //resolve(req.responseType); 24 resolve(req.response); 25 } else { 26 alert(req.status); 27 reject(new Error(req.statusText)); 28 } 29 }; 30 //受信が失敗した時に呼び出されるイベント 31 req.onerror = () => { 32 reject(new Error(req.statusText)); 33 }; 34 35 //req.responseType = 'json'; 36 req.send(null); // HTTPリクエストの発行 37 }); 38 } 39 40 41 42 43 async function init() { 44 var scene = new THREE.Scene(); 45 46 var renderer = new THREE.WebGLRenderer(); 47 renderer.setSize(900, 600); 48 49 document.getElementById("WebGL-area").appendChild(renderer.domElement); 50 51 52 53 54 var camera = new THREE.PerspectiveCamera(45, 1.5, 0.1, 1000); 55 camera.position.set(30, 45, 30); 56 camera.lookAt(scene.position); 57 58 var controls = new THREE.OrbitControls(camera); 59 controls.autoRotate = true; //自動周回 60 61 62 // 座標軸を表示 63 var axes = new THREE.AxisHelper(100); 64 scene.add(axes); 65 66 //形状オブジェクトの宣言と生成 67 var geometry= new THREE.Geometry(); 68 69 var value; 70 var dis=[]; 71 var rot=[]; 72 //dis,rot = await getCSV(); 73 value = await getValue(); 74 dis=value.dist; 75 rot=value.rot; 76 //dis=value.slice(0,2000); 77 //rot=value.slice(2001,4000); 78 //alert(dis[0]); 79 //alert(rot[0]); 80 //alert(dis); 81 //alert(rot); 82 83 84 // for(var i=0;i<1000;i++){ 85 // geometry.vertices[i]= new THREE.Vector3((data[i][0] * Math.cos( data[i][1] * (Math.PI / 180) ))/2, 86 // 0, 87 // (data[i][0] * Math.sin( data[i][1] * (Math.PI / 180) ))/2); 88 // } 89 90 for(var i=0;i<2000;i++){ 91 var x=(dis[i] * Math.cos( rot[i] * (Math.PI / 180) ))/2; 92 var y=(dis[i] * Math.sin( rot[i] * (Math.PI / 180) ))/2; 93 //alert(x); 94 //alert(y); 95 geometry.vertices[i]= new THREE.Vector3(x,0,y); 96 } 97 98 //材質オブジェクトの宣言と生成 99 var material=new THREE.ParticleBasicMaterial({color: 0xFF0000, size: 10.0}); 100 //点オブジェクトの生成 101 var particles = new THREE.ParticleSystem(geometry,material); 102 //点オブジェクトのシーンへの追加 103 scene.add(particles); 104 105 106 107 render(); 108 109 function render() { 110 controls.update(); 111 requestAnimationFrame(render); 112 renderer.render(scene, camera); 113 } 114 } 115 window.onload = init 116 </script> 117</body> 118</html> 119

試したこと

res.end()を記述するように書いている記事はありましたが、自分のこーどではもともと書いていました。

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

OS: ubuntu

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

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

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

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

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

guest

回答2

0

ベストアンサー

"getValue" のところの部分を以下のようにしてみたらどうでしょうか?

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

投稿2019/08/17 00:55

mokemokechicken

総合スコア948

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

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

aiai8976

2019/08/17 01:07

今のままだとオブジェクト型になっているのでstringに変換する必要があったんですね。 勉強になりました! ありがとうございます。
guest

0

google翻訳
最初の引数は、string型またはBuffer型のいずれかでなければなりません。

投稿2019/08/17 00:54

y_waiwai

総合スコア87802

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問