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

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

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

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

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

2回答

2277閲覧

【Express】index.jsで取得したパラメータをwwwに送信したい【socket.io】

shiro_momo

総合スコア8

Node.js

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

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

1クリップ

投稿2018/05/31 04:43

Expressを使用したソケット通信に悩んでいます。

routes直下にあるindex.jsで取得したパラメータをbin直下のwwwに送信?する方法がわかりません…

js

1//index.js 2// /?uuid=1というパラメータを取得↓ 3var express = require('express'); 4var router = express.Router(); 5 6router.get('/', function(req, res, next) { 7 res.render('index', { title: 'Express' }); 8 socket.emit("getQaData", {"number":req.query.uuid,}); 9}); 10 11module.exports = router;

js

1///www 2var app = require('../app'); 3var debug = require('debug')('aspen:server'); 4var http = require('http'); 5var fs = require('fs'); 6 7var server = http.createServer(app); 8server.listen(port); 9server.on('error', onError); 10server.on('listening', onListening); 11 12io = require('socket.io').listen(server); 13io.sockets.on('connection', function(socket) { 14 15 socket.on('getQaData', function(data) { 16 io.sockets.emit('confirm', { 17 "number":req.number, 18 }); 19 }); 20 21});

現状、これではindex.jsからwwwへのパラメータ受け渡しはできず、どうしたものかと悩んでいます…「uuid=1」というパラメータをグローバル変数化すれば行けると思うですがやり方がわからず…

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

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

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

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

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

guest

回答2

0

自己解決

以下の変更点で解決いたしました。

・ioをglobal変数化
・index.js内の「getQaData」を「confirm」へ変更

index.js↓

js

1router.get('/', function(req, res, next) { 2 res.render('index', { title: 'Express' }); 3 global.io.sockets.emit("confirm", {"number":req.query.uuid}); 4});

www↓

js

1global.io = require('socket.io').listen(server); 2global.io.sockets.on('connection', function(socket) { 3 4 socket.on('getQaData', function(data) { 5 global.io.sockets.emit('confirm', { 6 "number":data.number, 7 }); 8 }); 9 10});

投稿2018/05/31 12:25

shiro_momo

総合スコア8

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

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

0

Socket.ioはたくさんのユーザを待ち受けるサーバの実装方法の一つであり、
Expressもたくさんのユーザを待ち受けるWebサーバの実装方法の一つですよね?

コードの意図は「Socket.ioに繋ぎ、socket引数を生成してからExpressの/にAjax通信でアクセスしてUUIDを確定させる」という事がしたいように見受けられますが、
100人がSocket.ioサーバに押しかけて、100個のsocket変数が生成された後、
ゼロベースで通信した/へのアクセスでUUIDを拾ったとして、どのsocketに紐付ければ良いんですか?

まぁ、この辺は適当に回避しながら作ってみましょうか
大事なのは、オブジェクトを引数とする関数宣言です。

JavaScript

1// index.js 2// /?uuid=1というパラメータを取得↓ 3var express = require('express'); 4 5// 引数として注入したstatesは何時でも参照出来るようになる 6module.exports = states => { 7 const router = express.Router(); 8 9 router.get('/', function(req, res, next) { 10 res.render('index', { title: 'Express' }); 11 // 対応するsocketを探す 12 const socket = state.socketByHash.get(req.query.hash); 13 socket.emit("getQaData", {"number":req.query.uuid,}); 14 }); 15 16 return router; 17}

JavaScript

1///www 2const app = require('../app'); 3const debug = require('debug')('aspen:server'); 4const http = require('http'); 5const fs = require('fs'); 6 7// 状態を宣言しておく 8const states = { 9 socketByHash: new Map() 10} 11 12// 関数実行を行いstatesを注入 13var server = http.createServer(app(states)); 14server.listen(port); 15server.on('error', onError); 16server.on('listening', onListening); 17 18io = require('socket.io').listen(server); 19io.sockets.on('connection', function(socket) { 20 // 適当なハッシュ値を生成する、現在時刻とIPアドレス辺りを使えば良いんじゃない? 21 const hash = createHash(); // createHash関数は自分で作ってねv 22 states.socketByhash.set(hash, socket); 23 // ユーザーがAjax通信で指定できるように、利用するハッシュ値は通知しないとだめよ 24 25 socket.on('getQaData', function(data) { 26 io.sockets.emit('confirm', { 27 "number":req.number, 28 }); 29 }); 30 31});

ハッシュ値のアルゴリズムは下記のような記事がありますが、他でユーザーを認識する方法があればそちらを使えば良いかと思います。
Node.jsでSHA1ハッシュを計算する

JavaScriptに於けるオブジェクトは「参照の値渡し」です。
詳しい話は「JavaScript 参照の値渡し」などでググってください。

大事なのはオブジェクトを引数として渡してやると参照渡しのように扱えるので、
index.js内で実際にアクセスが来た時、常に最新のstates.socketByHashを参照出来るというところにあります。

この様にNode.jsでは関数定義という形で、オブジェクトを注入する手法はよく使われるので覚えておいてください。

投稿2018/05/31 07:08

miyabi-sun

総合スコア21158

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

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

shiro_momo

2018/05/31 10:17

詳しい解説ありがとうございました。 前提条件の記載不足で申し訳ありません。 今回取得するUUIDは「1」「2」「3」「4」の4つと決まっております。(IDの数値は仮です) それぞれのIDが割り振られたRFIDタグをリーダに読み込ませ、該当する番号の画像を出しわけるというシステムを作っております。 リーダからはアルディーノの経由してIDが送信される仕組みです。 現状、タグを読み取った際に index.jsにて router.get('/', function(req, res, next) { res.render('index', { title: 'Express' });  console.log(req.query.uuid); //出力結果「1」 }); までは得られたが、この「req.query.uuid=1」をどうやったらwwwで参照できるのかしらという悩みでした。 今回ご教示いただいた方法を私なりにかみ砕き試してみましたが、js自体の初心者という事もあり、いまいち値がどう引き継がれているのかイメージできませんでした。 機能以前の勉強不足を実感いたしましたので「オブジェクト」や「値渡し」から勉強したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問