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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Node.js

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Express

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

2610閲覧

php(Laravel)からnode.js(Express)を動かした場合の戻り値の受取り方

higehige

総合スコア12

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Node.js

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Express

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2019/12/25 04:32

先輩方の知見をお借りできますと幸いです。

現在、php(Laravel)でWebアプリを作成しています。
できるだけLaravelの中で完結したかったのですが、どうしてもnode.jsのライブラリを使う必要があり、一部node.js(Express)を組み込んで試みています。

node.jsの理解自体も浅いのですが、ポートを指定してリクエストをすることで、サーバ上でJSファイルを動かすものだということは理解できました。
そこで、以下のような実装を試みています。
①Laravel側で

html

1<a href="http://localhost:3000/test"></a>

のとしてGETでリクエスト

②Express側で

express

1app.get('/test', function(req, res){ 2async function func() { 3var val = await ※値を持ってくるライブラリ※(); 4res.redirect('http://localhost:8000/return'); 5} 6func(); 7})

として、ライブラリを動作して変数valに格納し、
ポートを指定して、Laravelに戻す。

という実装をしました。

ご教授いただきたいのは、二点です。

・GETリクエストのURLの指定方法について。
LaravelからExpress、ExpressからLaravelへのルーティングで、ポートを指定しないといけないことは理屈では理解しつつも、このようにサイト内導線をフルパスで書くことに違和感があります。
他に、適正な書き方があるような気がしておりますが、この記述に問題がないか、ご意見を頂けますと幸いです。

・Expressからの戻り値について
Express側で取得した変数valを、Laravel側で使用したいと考えておりますが、Laravel側にどう戻すのかが調べても分かりませんでした。
こちら、Express側の変数valを、Laravel側で使えるようにする方法があれば、ご教示を頂けますと大変助かります。

また、可能であればページ遷移をしなくとも、戻り値だけが取得できないかと、ajaxも試しました。

ajax

1type:'GET', 2url:'http://localhost:3000/test', 3dataType:'string',

しかし、コンソールに

console

1Access to XMLHttpRequest at 'http://localhost:3000/test' from origin 'http://localhost:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

というエラーが出てしまい、見るとクロスドメインでajaxリクエストができないインターネットのルールに引っかかっているようでした。
しかし、ドメインは同じなので、ポートが違うと異なるドメイン扱いになるのかと勉強になりました。

理想は、ページを遷移しないでnode.jsをサーバ側で動かして、戻り値だけを得られればベストですが、こちらの方法ももしあれば、ご教示頂けますと大変助かります。

かなり初歩的な質問かと思いますが、、、よろしくお願いいたします!

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

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

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

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

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

guest

回答1

0

ベストアンサー

node.js側からちょっとした文字列を返す簡単なことを実現したいだけなら今やってることは全部忘れていい。

ライブラリを実行してvalを標準出力に出力するだけのtest.jsを作る。
これだけなら簡単。Expressとかいらない。

node test.js

でvalが出力されればいい。

Laravel側からはこれを実行。
exec()などPHPからコマンドを実行する方法は色々ある。

php

1$val = shell_exec('node test.js');

Laravelならプロジェクトのbin/test.jsにでも置いてこういう使い方になるだろうけど。

php

1$val = shell_exec('node ' . base_path('bin/test.js'));

symfony/processがいいけど実現方法はなんでもいい。
もちろんLaravelを動かすサーバーにnodeのインストールも必要。

もっと複雑な場合はExpressでAPIを作ってjsonを返す。
Laravel側からはGuzzleなどのHttpClientを使う。

投稿2019/12/25 06:03

kawax

総合スコア10377

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

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

higehige

2019/12/25 14:02 編集

親切なご回答ありがとうございます! 恥ずかしながら、exec()コマンドを知りませんでした。。 早速試してみましたところ、Laravelのコントローラにて、 public function sample() { $data = shell_exec('node ' . base_path('resources/assets/js/sample.js')); return $data; } といった方法で、無事返却地を受け取ることができました!! また、シェルスクリプトでも引数の私方もわからなかったのですが、 https://qiita.com/furusin_oriver/items/f030d1eaa9e7b54233c3 このように、渡すと、node.js側で「process.argv[int]」という形で受け取れるというのも初めて知りまして、とても勉強になりました。 誠にありがとうございます。 ただ、もう一点だけどうしても解せないことがございまして、、。 無事、引数を渡すことができたのですが、その戻り値の挙動がどうも解せなくございまして。。 node.jsの方ではこのように書いており、 function func() { var sample = "ここがreturnで返されると思ったのだが、返却されない"; console.log("コンソールの文字が返却されてしまう"); return sample; } Laravelのコントローラの方では、 public function sample() { $data = shell_exec('node ' . base_path('sample.js'." aaa"." bbb"." ccc")); return $data; } このように書いているのですが、node.jsの変数sampleがreturnされて戻り値になると想定しているのですが、なぜかconsole.logの中身が戻り値になってしまいます。。 この場合は、console.logの内容が戻り値になるというのは正常な挙動なのでしょうか。。 結局、戻したい値をconsoleに入れれば動作するので動くことは動くのですが、解せない挙動のため、今一度アドバイスを頂けますと幸いです。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問