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

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

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

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Node.js

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1138閲覧

Webアプリの処理が共有されてしまう

mi_ho

総合スコア34

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Node.js

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2021/05/14 01:10

編集2021/05/14 02:11

Webアプリ制作初心者です.
node.js + herokuでWebアプリを作成しています.
サーバーサイド(node.js)で,あるサービスのAPIへアクセスし,それをJavaScriptでブラウザ上に描画するというものです.

デプロイしたURLで,正常にアプリは動いたのですが,全てのURLで処理が共有されてしまいます.
例えば,2つのタブでWebアプリを開いて,一方のタブで描画処理を行った場合,もう一方のタブでも描画処理が行われてしまいます.
処理をユーザーごと,もしくはタブごとに分けたいのですが,どのような方法があるでしょうか.
ご教授お願いいたします.

コードを追加しました. 2021/5/14 11:10

Js

1var socketio = io(); 2$(function(){ 3 $('#message_form').submit(function(){ 4 socketio.emit('message', "***"); //ブラウザでボタンが押されたらメッセージを送る 5 }); 6 socketio.on('output',function(msg){ //Nodeから返されたjsonを描画 7 draw(msg); //描画関数 8 }); 9});

Node

1var express = require('express'); 2var app = express(); 3var http = require('http').Server(app); 4const io = require('socket.io')(http); 5const PORT = process.env.PORT || 7000; 6 7app 8 .get('/', (req, res) => res.sendFile(__dirname+'/index.html')) 9 .use("/static", express.static(__dirname + "/static")) 10 11http.listen(PORT, function(){ 12 console.log('server listening. Port:' + PORT); 13}); 14 15io.on('connection',function(socket){ 16 socket.on('message',function(msg){ 17 get_json(); //ブラウザでボタンが押されたらget_json()を実行 18 }); 19}); 20 21const axios = require('axios'); 22var fs = require('fs'); 23var masterData_output = ""; 24 25function get_json(){ //APIへアクセスしてjsonを取得 26 (async () => { 27 try { 28 const response = await axios.get("api-url", { 29 headers: { 30 Cookie: "connect.sid=***" 31 }, 32 }); 33 masterData_output = JSON.stringify(response.data, null, ' '); 34 io.emit('output', masterData_output); 35 } catch (error) { 36 console.log(error); 37 } 38 })(); 39}

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

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

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

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

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

maisumakun

2021/05/14 01:40

どのようなコードを書いたのでしょうか?
mi_ho

2021/05/14 02:11

ご依頼ありがとうございます. コードを追記しました. 不足があればお申し付けください.
AbeTakashi

2021/05/14 02:34

ご自分で書かれたコードですか? 普通にSocket.IOを使ってるので、むしろその動作が通常に思えますが・・・ Socket.IOを使ってる理由はなんでしょうか?
mi_ho

2021/05/14 02:45

TakashiAbeさん,ありがとうございます. Node.jsをWebサーバとして使用する際に,レンダリングをするJavaScriptと通信する手段を調べて,Socket.IOに行き着きました. Socket.IOを使うと,全てのURLで処理が行われてしまうのでしょうか?
mi_ho

2021/05/14 02:46

追記:コードは自分で書いたものです.
AbeTakashi

2021/05/14 03:02

なるほど、Socket.IOは単純に使うと接続してるすべてのコネクションに同じようにデータを返してしまうので、「個を識別して必要な人だけにデータを送信する仕組み」を考えて入れないとそういう挙動になりがちです。単純なチャットアプリをつくるにしてもそのような実装をしないと使い勝手の悪いチャットになります。なので、そういう実装を目指すべきかと思います。ちょっといじればいけるはずですけどね。 参考) https://blog.katsubemakito.net/nodejs/socketio/realtime-chat2
mi_ho

2021/05/14 03:06

TakashiAbeさん,ご助言ありがとうございます! Socket.IOについて調べなおしてみます!
mi_ho

2021/05/14 03:21

TakashiAbeさん 参考にいただいた記事を読みました.この方針でいけそうです. ありがとうございました. TakashiAbeさんのコメントをベストアンサーにさせていただきたいのですが,「質問への追記・修正の依頼」のコメントにはベストアンサーをつけられないようです. お手数ですが,同じ内容を回答として投稿していただくことは可能でしょうか.
AbeTakashi

2021/05/14 03:27

ヒントしかお伝えしてないので、同じような悩みを持つ人のために可能な範囲で解決したソースコードを共有して頂き自己解決としていただくのがベストかと思います!
mi_ho

2021/05/14 03:30

TakashiAbeさん ありがとうございます! では自分で頑張ってみて,自己解決を書き込もうと思います.
mi_ho

2021/05/14 22:44

アドバイスいただいた方法で解決できたので,自己解決書き込みました! ありがとうございました!
guest

回答1

0

自己解決

「質問への追記・修正の依頼」にて,TakashiAbeさんにユーザーを識別してsocket.io通信を行う方法についてアドバイスいただきました.
こちらを参考にコードを書き換えたところ,トークンを用いてユーザーを識別し,必要な人にだけデータの送信を行うことができました!
アドバイスくださった方々,ありがとうございました!

参考にしたWebページ

変更したところにコメントをつけています↓

JS

1var socketio = io(); 2$(function(){ 3 $('#message_form').submit(function(){ 4 socketio.emit("message", { 5 text: ***, 6 token: socketio.id //socketio.id(トークン)を送信 7 }); 8 }); 9 socketio.on('output',function(msg){ 10 draw(msg); 11 }); 12});

Node

1io.on('connection',function(socket){ 2 socket.on('message',function(msg){ 3 get_json(msg.token); 4 }); 5}); 6 7const axios = require('axios'); 8function get_json(token){ 9 (async () => { 10 try { 11 const response = await axios.get("api-url", { 12 headers: { 13 Cookie: "connect.sid=***" 14 }, 15 }); 16       io.to(token).emit("output", response.data); //トークンを指定して送信 17 } catch (error) { 18 console.log(error); 19 } 20 })(); 21}

※Nodeは変更に関連する部分のみ

投稿2021/05/14 22:43

mi_ho

総合スコア34

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問