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

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

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

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

Node.js

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

解決済

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

aiai8976
aiai8976

総合スコア112

JSON

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

Node.js

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

2回答

0評価

0クリップ

6927閲覧

投稿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

// 必要なファイルを読み込み var http = require('http'); var url = require('url'); var fs = require('fs'); var server = http.createServer(); const MongoClient = require('mongodb').MongoClient; // Connection URL const url_db = 'mongodb://localhost:27017'; // Database Name const dbName = 'study'; 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({}).toArray(function(err, docs) { //assert.equal(err, null); //console.log("Found the following records"); value=docs; //console.log(value); //callback(docs); }); }); // 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 () { //結果 // var value; // Find some documents /*collection.find({}).toArray(function(err, docs) { //assert.equal(err, null); //console.log("Found the following records"); value=docs; console.log(value); callback(docs); });*/ /*value=collection.find(); console.log(value);*/ client.close(); // HTTPレスポンスヘッダを出力する res.writeHead(200, { 'content-Type': 'text/html', 'Access-Control-Allow-Origin': '*' }); console.log("レスポンス"); //console.log(result); console.log(value); // HTTPレスポンスボディを出力する res.write(value); 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(1234); console.log('Server running at http://localhost:80/');

index.html

index.html

<html> <head> <script type="text/javascript" src="js/three.js-master/build/three.min.js"></script> <script type="text/javascript" src="js/OrbitControls.js"></script> </head> <body> <div id="WebGL-area"></div> <script type="text/javascript"> function getValue() { //promiseを使うことで簡潔に記述できる return new Promise((resolve, reject) => { //resolveまたはrejectの結果を返す var req = new XMLHttpRequest(); // HTTPでファイルを読み込むためのXMLHttpRrequestオブジェクトを生成、サーバと非同期通信するためのAPI req.open("get", "http://****:1234/get_value", true); //req.setRequestHeader("Access-Control-Allow-Origin", "*"); //受信が成功した時に呼び出されるイベント req.onload = () => { //通信が正常に終了したかを確認する if (req.readyState === 4 && req.status === 200) { console.log(req.readyState); console.log(req.status); //resolve(req.responseType); resolve(req.response); } else { alert(req.status); reject(new Error(req.statusText)); } }; //受信が失敗した時に呼び出されるイベント req.onerror = () => { reject(new Error(req.statusText)); }; //req.responseType = 'json'; req.send(null); // HTTPリクエストの発行 }); } async function init() { var scene = new THREE.Scene(); var renderer = new THREE.WebGLRenderer(); renderer.setSize(900, 600); document.getElementById("WebGL-area").appendChild(renderer.domElement); var camera = new THREE.PerspectiveCamera(45, 1.5, 0.1, 1000); camera.position.set(30, 45, 30); camera.lookAt(scene.position); var controls = new THREE.OrbitControls(camera); controls.autoRotate = true; //自動周回 // 座標軸を表示 var axes = new THREE.AxisHelper(100); scene.add(axes); //形状オブジェクトの宣言と生成 var geometry= new THREE.Geometry(); var value; var dis=[]; var rot=[]; //dis,rot = await getCSV(); value = await getValue(); dis=value.dist; rot=value.rot; //dis=value.slice(0,2000); //rot=value.slice(2001,4000); //alert(dis[0]); //alert(rot[0]); //alert(dis); //alert(rot); // for(var i=0;i<1000;i++){ // geometry.vertices[i]= new THREE.Vector3((data[i][0] * Math.cos( data[i][1] * (Math.PI / 180) ))/2, // 0, // (data[i][0] * Math.sin( data[i][1] * (Math.PI / 180) ))/2); // } for(var i=0;i<2000;i++){ var x=(dis[i] * Math.cos( rot[i] * (Math.PI / 180) ))/2; var y=(dis[i] * Math.sin( rot[i] * (Math.PI / 180) ))/2; //alert(x); //alert(y); geometry.vertices[i]= new THREE.Vector3(x,0,y); } //材質オブジェクトの宣言と生成 var material=new THREE.ParticleBasicMaterial({color: 0xFF0000, size: 10.0}); //点オブジェクトの生成 var particles = new THREE.ParticleSystem(geometry,material); //点オブジェクトのシーンへの追加 scene.add(particles); render(); function render() { controls.update(); requestAnimationFrame(render); renderer.render(scene, camera); } } window.onload = init </script> </body> </html>

試したこと

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

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

OS: ubuntu

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

JSON

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

Node.js

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