Node.jsでajaxがうまくいかない

このQ&Aのポイント
  • Node.jsを使ったajaxの実行がうまくいかない問題が発生しています。
  • PHPで動作していたが、Node.jsで同様の結果を得ようとしてもうまくいかず困っています。
  • ローカルでもNode.jsのサーバは立ち上がるが、ajaxが正常に動作しないため、問題の原因を特定できません。
回答を見る
  • ベストアンサー

Node.jsでajaxがうまくいかない

nodejs初心者なのでよくわからずやっていて恐縮ですが、うまくいきません。 https://phpotameshi-hoto345.c9users.io/node-ajax/hello_ajax.html なのですがもともとはphpで送信ボタンを押したときにphpが実行されるものでしたが、これを少し改良してNode.jsでやってみようと思ったのですが、phpと違って <script src="scripts/hello.js"></script> のようにnodejsを読み込んでやれば同じ結果になると思ったのですがうまくいきません。 その前にローカルでもNode.jsは使えるようなので >node test.js Server running at http://localhost:8124/ のようにしてローカルでやってもhttp://localhost:8124/自体は問題なく立ち上がりtest.jsの中身は実行されたのですが、ajaxの方がうまくいきません。 ローカルでのNode.jsもServer running at http://localhost:8124/ となっていればNode.jsのサーバは起動しているので、 ローカルでhello_ajax.htmlを起動して、buttonを押せばajaxもnodejsも実行されるのではないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • catpow
  • ベストアンサー率24% (620/2527)
回答No.4

>>このローカルサーバはphpでいうザンプ、 サーバ上で言うcloud9と同じようにほぼ制約なくサーバサイトのプログラミングがすべて行えると考えてよいのでしょうか? 初歩的なテストであれば、同じように使えると考えていいはずです。 もちろん、クラウド環境は、ローカル環境と違う部分がどうしてもあるはずなので、サーバ側(クラウド環境)で実行する予定のものがすべて行えるとはいえません。 >>サーバサイドでできることに制約があるからなのでしょうか? サーバサイドはフロントと違ってなんでもできると思っていたのですがそうではないのでしょうか? サーバ側、クライアント側(フロント側)は、別のプログラムであってネットワークを通して接続しています。 ですから、それぞれにできることは制約があります。 サーバサイドは、サーバ側で可能なことは多いけど、直接にクライアントのDOMの操作はできません。 さらにいえば、通常、サーバとクライアントの通信は、ステートレスで動作しています。 たとえば、ログイン画面で、ユーザID、パスワードを入力し、本人確認が終了したとしても、その次に「残高照会表示」とクライアントの画面メニュで選択して送信したとき、サーバ側プログラムは、何もしないと、直前動作の「本人確認」が完了か未完了かさえわかりません。 本人確認は、サーバが認証後にクライアントに送ったクッキーという小さなファイルをクライアントが、次の通信で返すから、「認証済み」と判断しているだけです。 (通常は、こういった処理は、フレームワークがうまくやってくれています) だから、クッキーを誰かに盗まれたら、他人が本人に成り済まして通信をすることが可能になります。 まあ、いずれにしても、Webサイトのプログラミングは、スタンドアロン、あるいは、クライアント&サーバ形式のプログラミングより、覚えることは多いし、プログラミング上の制約は多いし、セキュリティは、さらに重要になるので、大変です・・・。 特に、セキュリティに関しては、一般公開のこういう場とか、書籍では、模倣犯を恐れて、具体的なことが書かれないことが多いですからね。 勉強材料としては、IPAのセキュリティ資格試験の問題みたいなものを参考にしないと分かりにくいですね。

htmlcss123
質問者

お礼

ご丁寧なご返信大変ありがとうございます。 >>> サーバ上で言うcloud9と同じようにほぼ制約なくサーバサイトのプログラミングがすべて行えると考えてよいのでしょうか? 初歩的なテストであれば、同じように使えると考えていいはずです。 もちろん、クラウド環境は、ローカル環境と違う部分がどうしてもあるはずなので、サーバ側(クラウド環境)で実行する予定のものがすべて行えるとはいえません。 それでは下記のローカルサーバでも、ザンプのように、ほとんどのことは試せるので、学習のためにいろいろ作って試す分には、 これで十分なのですね。 これならcloud9がいらないので、今回のajaxを使ってクリックしたときにDOM生成してコンテンツがfadeinするようなことも問題なくできるはずなのですね。 Server running at http://localhost:8124/ するとほんだいにもどるのですが、ajaxをボタンをクリックしたときに実行して、要素を出現させるには、下記のようにそのものを実行すればよいというわけではないようですね。 http://localhost:8124/scripts/hellow_ajax.js ajaxのjsファイルはあくまでクライアント側なので、これは <script src="scripts/hellow_ajax.js"></script> という形で普通にレンダリング時に読み込んでやればOKという事でしょうか? ローカルサーバは、まずnode用のサーバのソースが入っているtest.jsをコマンドプロンプトで実行し、サーバを起動し、 http://localhost:8124/index.html という形でhtmlファイルをブラウザで実行してやればよいのでしょうか? あとは普通にクリックしてやれば、ajaxが実行されて、サーバ側で処理されて、 要素が出現するはずという事で良いでしょうか? >>> サーバサイドは、サーバ側で可能なことは多いけど、直接にクライアントのDOMの操作はできません。 やっぱりサーバサイドはDOM操作系の関数は存在しなく、実行することは不可能なのですね。 よってcreateElementなんて関数しらないよとか document is not defined つまりdocumentオブジェクトすら知らないよと出てくるのですね。 つまりdocumentオブジェクトやwindowオブジェクトにアクセスすらできないのであればこの中にある関数やプロパティは一切サーバサイドは使えないのですね。 document.getElementBy何とかとかの関数は一切使えないのですね。 フロント側からするとびっくりです。 >>> まあ、いずれにしても、Webサイトのプログラミングは、スタンドアロン、あるいは、クライアント&サーバ形式のプログラミングより、覚えることは多いし、プログラミング上の制約は多いし、セキュリティは、さらに重要になるので、大変です・・・。 特に、セキュリティに関しては、一般公開のこういう場とか、書籍では、模倣犯を恐れて、具体的なことが書かれないことが多いですからね。 勉強材料としては、IPAのセキュリティ資格試験の問題みたいなものを参考にしないと分かりにくいですね。 サーバサイドはフロントと比べると情報が少なく、自分が作ったソースでわからなくても危険なので、 ソース張ってここで教えてもらう事も厳しいのですね。 すると個人で仕事を請けたり、在宅で請けるのはサーバサイドはフロントと比べると非常に厳しく、 まず請けることが難しいのですかね。 ただフロントと違ってソースコードが閲覧者にばれないという点ではセキュアですがそれ以外は危険でしかないですね。 クライアント&サーバ形式のプログラミングというのはajaxの事でしょうか? 問い合わせフォームなどはこれに当たらないという事ですかね?

htmlcss123
質問者

補足

ローカルで行ったことがなく頭がこんがらがっているのですが、 http://localhost:8124/index.html としてもindex.htmlファイルがサーバ用のソースのあるjsファイルのカレントディレクトリにないと実行できないのですかね。 index.htmlをカレントディレクトリにコピーしてみて実行したのですが、ずっと応答を待っていますのままになりました。 サーバ上ならhtmlをアップロードしてアドレスを指定すればよいとわかるのですがローカルだといまいちわかりません。 ローカルの場合のパスはサーバ用のJSファイルをhttp://localhost:8124/と考えてここからの相対パスを書いてやればよいという事でいいでしょうか? これでhtmlファイルをサーバ上で実行したことになるのですかね? つまりサーバ用のJSとindexがカレントディレクトリにあれば http://localhost:8124/index.html でよいのですね

その他の回答 (3)

  • catpow
  • ベストアンサー率24% (620/2527)
回答No.3

>>ただするとどうやってNodejsをアドレスで指定して実行されながら、 htmlも実行してUIを表記するのでしょうか? Ajax : Asynchronous JavaScript + XML ですね。 クライアント側のhtmlの中に記述されているJavaScriptからサーバに、キー入力があれば送信して、サーバ側プログラムは、それを受けて、処理結果をXMLでデータをクライアント側に返す。 クライアント側は、受け取ったデータで、一部画面の書き換えを行うって流れになっています。 流行のNode.jsは知らないのですが、この仕組みは変わらないと思います。 私は、C#を使うASP.NET Coreで開発していますが、Ajaxの機能は、まだ使っていません。 なので、実践経験じゃあなく、ネットや書籍からの情報によるだけの回答ですが・・・。

htmlcss123
質問者

お礼

ご丁寧にご回答大変ありがとうございます。 その後ローカルサーバ上で Server running at http://localhost:8124/ hellow hellow に成功しました。console.logがまさかプロンプト上に出るとフロントの人間は思わなかったのですが、サーバサイドはプロンプトじょうに出るのですね。 このローカルサーバはphpでいうザンプ、 サーバ上で言うcloud9と同じようにほぼ制約なくサーバサイトのプログラミングがすべて行えると考えてよいのでしょうか? はまりたくないので教えていただければ幸いです。 しかしその後下記のように要素を追加しようとしたところエラーが出ます。 これはやはりフロントではできるDOM操作がサーバサイトではできないなど、 サーバサイドでできることに制約があるからなのでしょうか? サーバサイドはフロントと違ってなんでもできると思っていたのですがそうではないのでしょうか? ・ http.createServer((request, response) => { // myCode const createTestDiv = document.createElement('div'); document.body.addChild(createTestDiv); createTestDiv.innerHTML = 'imadediv'; console.log('hellow'); // /myCode response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello World!\n'); }).listen(PORT); としたところ下記のエラーが出ます。 \node-ajax\scripts\test.js:7 const createTestDiv = document.createElement('div'); ^ ReferenceError: document is not defined at Server.http.createServer (C:\Users

  • catpow
  • ベストアンサー率24% (620/2527)
回答No.2

>>なのですがもともとはphpで送信ボタンを押したときにphpが実行されるものでしたが、 質問者さんは、誤って理解しています。 元のプログラムで送信ボタンを押したとき、最初に動作しているのはphpではなく、htmlあるいは、JavaScriptです。(元のプログラムを見ていないので、あいまいですが) だから、No.1さんの回答にあるような指摘も受けることになっているのです。 うまくいかなくて当然でしょう。

htmlcss123
質問者

お礼

https://phpotameshi/node-ajax/scripts/hello.js のようにアドレスバーに入れるのはサーバサイドのNodejs自体を選択しないとイベントリスナーでクリックした際に実行するという形ではサーバサイドでは実行されないのですね。 イベントリスナーでの実行は中身のコードがNodejsでもフロント側で使うJSとして実行されてしまうという事なんですね。 ただするとどうやってNodejsをアドレスで指定して実行されながら、 htmlも実行してUIを表記するのでしょうか? html内にNodejsも記載してファイルを分離しないようにするしかないという事ですか? 初心者なので初心者にもわかるように教えていただければ幸いです。 ただNodejsファイルをアドレスに入れたところコードは実行されずにconsole.log('hellow');という中身がそのまま表記されてしまいます。 恐らくサーバ側で実行されていないのでしょうが、 http://localhost:80/ で実行するにはどのようにしたらよいのでしょうか? また、cloud9だとphpでつくったアカウントとは別にNodejs用のアカウントを作らないといけないのでしょうね・

  • drum_KT
  • ベストアンサー率43% (1108/2554)
回答No.1

<script src="scripts/hello.js"></script> 貼ってあるURLは見に行っていません(安全である保証がないので)。が、この書き方では、hello.jsがブラウザ側に読み込まれてしまうだけで、サーバ側で起動はしないのでは?

関連するQ&A

  • node.jsを始めたいが、うまくできない

    http://libro.tuyano.com/index3?id=1116003&page=3 このページを参考にnode.jsを入門したいと思っています。 node.jsのコマンドプロンプトに「cd Desktop\node.js-sample\」 を打ち込んで、「node sampleapp.js」も打ち込んだのですが、Server running!!はでません。 勿論、Desktop\node.js-sample\sampleapp.jsというふうに設置しています。 Desktop\node.js-sampleではなくC:\Users\***\Desktop\node.js-sample も試しましたが、できませんでした。 node.jsのコマンドプロンプトは、 > cd Desktop\node.js-sample\ ・・・ この状態でとまっています。 何がいけないのか教えて下さい。

  • node.jsのシェル上で

    コンソール上でnodejsを起動してシェルとしてつかった場合 var x="グローバル変数"; console.log(x); //とするとグローバル変数と出力されます。 さらに console.log(this.x); //とするとグローバル変数と出力されます。 そもそもグローバル変数とはトップレベルコードにおけるオブジェクトのプロパティとあります。 ブラウザだと、トップレベルのスコープで定義した変数は alert(window . variable); でアクセスできます。 ですから、nodeコンソール上で xとっ宣言した変数がthis.xとトップオブジェクトとしてアクセスできることはわかったのですが これをコンソールではなく、jsファイルに描いてそれをnodeコマンドで実行した場合 ~$ node test.js といった具合に実行させた場合 どうも、undefindeと表示されてしまうのです。 これは何が原因でundefinedと出力されてしまうのでしょうか?

  • node.js使いドコロ

    node.jsでhttpでの応答をする簡単なものを作ってみたりしました。 ふと、これhttpに限って言えばapacheさんにお任せ出来ていた部分まで面倒見ないといけないから手順ばっかり増えてメリットあるんだろうか?と感じました。 スクリプト言語なので爆速ではないですよね。。。つーことは集計とかの計算に使えるわけでもなく? http://www.slideshare.net/tricknotes/nodejs-27589695 なども覗いて見たのですが結局わかりませんでした。 結局どういうシーンでの活躍が期待できそうor活躍しているでしょうか? さらっと表面しか見ていない状況での質問で申し訳ありませんが、よろしくお願いします。

  • どこまでがAjaxなの?

    現在、Ajaxを勉強中の初心者です。 質問のタイトル通りなのですが、どこまでがAjaxなのかイマイチわかりません。 AjaxはJavaScript + XMLで非同期通信をする技術ですが 1.画像やプログラムファイルをサーバPC側に入れておいてクライアントPC側でラジオボタンの選択によって画像表示を変えるのはAjaxですか、それともただのJavaScriptですか? 2.サーバを使って以下のような入力可能文字カウンタを表示させるのはAjaxですか、それともただのJavaScriptですか? <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <title>文字のカウント</title> </head> <body> <form>   <textarea cols="46" rows="5" id="title1" name="title1" size="50"></textarea><br />   あと<span id="inputlength1">20</span>文字入力できます<br /> </form>   <script type="text/javascript"><!--     function lengthCounter (node, max, cut) {       max = max || Number (node.maxLength) || 20;       return function () {         var rest = max - node.value.length;           if (rest < 0) {             if (cut) {               alert ('20文字以内にしてください');               rest = max;               node.value = node.value.substring (0, max);             }           }           return rest;       };     }     function dispValue (node, cbFunc) {       return function () {         node.firstChild.nodeValue = cbFunc ();   };     }     setInterval (dispValue ( document.getElementById ('inputlength1'),     lengthCounter (document.getElementById ('title1'), 20, true)), 100);   // --></script> </body> </html> 3.「googleサジェストのインクリメンタル検索にはAjaxの技術が利用されている」←ここでのAjaxにはPHPも含まれますか? 私はPHPをAjaxの枠には入れないような気がします。正確にはPHPとAjaxでインクリメンタル検索機能がつくられていると思うのですが。 4.PHPのみでAjaxと同じ非同期通信ができればそれはAjaxと呼ぶのか? よろしくお願いします。

    • ベストアンサー
    • AJAX
  • JSその物でサーバサイドのプログラミングが出来る?

    JSその物やtypescriptでもサーバサイドのプログラミングが出来ると思って良いのでしょうか? JSその物nodeやexpressは、全く別の言語と思った方が良いのでしょうか? それともJSその物やtypescriptないしはバベルを学べば、同じ文法同じめどっどを使って、ほぼ同じように、トイアワセフォームやショッピングカートなどが作れるようになるのでしょうか? JSその物やtypescriptでも、nodeやexpressと組み合わせれば、 問い合わせフォームやショッピングカートのサーバサイトのWEBアプリが作れるというような情報をその後見つけました。 私が知識不足でJSその物やtyescriptではサーバサイドのプログラミングは出来ず、NodejsやEXPRESSは、 JSその物やtyescriptとは違う言語のように大きく違う物と思っていましたが、下記をみるとあまり変わらず、 クライアントサイドがJSその物やtyescriptで出来れば、NodejsやEXPRESSを同じように作れるのかもしれませんね。 http://okamuuu.hatenablog.com/entry/2016/02/02/165404

  • Ajax環境のつくり方

    Sigma Visual Ajax GUI Builder http://www.sigmawidgets.com/ http://www.sigmawidgets.com/products/sigma_visual/VisualJS/index.html と言うWEBサービス上でWEBインターフェイスを作成したのですが WEB技術の知識が殆ど無く、興味本位でテストしてみたかったのですが。 作成したデータをローカルサーバに置いてブラウザからアクセスしてみ たのですがJSファイルを延々と読込み状態のままUIが表示されません。 Sigma Visual Ajax GUI Builder側の実行ボタンでの確認時は正しく 表示されるので、ローカルのサーバー等の設定の問題かと思います。 JSの知識すら無いので、「.HTML」ファイルと同じように ROOTフォルダにダウンロードしたファイルをただ置いただけですが それでは動かないものなのでしょうか? 実行エンジン等との関連付け等が必要なのでは無いかと思いだ しましたが、どのファイルが実行エンジンなのかわかりません。 説明すら検討違いでしたら申しわけありません。 要は、Sigma Visual Ajax GUI Builderをローカルサーバで動かす には、どのデータを何処に保存して、どのような設定をすれば良いか と言う事が知りたいのですが、お解りになられる方お願いします。

    • ベストアンサー
    • AJAX
  • とあるAJAXでの値の受け取り方について

    PHPはわかりますが、JSはまったくの初心者です。 こちらのサンプルでAJAXの練習中です。 http://www.imztry.net/dhtml/027/027-2.html 動作はするんですが、その値をどうすればフォームとして($_POST)で 受け取ることができるのか、お力をお借りしたいと思います。 「save」ボタンを押すと、下のほうにメッセージが流れます。 box3|node17; box3|node18; の値をPOSTデータで送りたいんですが、どうもうまくいきません。

  • ウィンドウズ上の一般ユーザはNode.js使える?

    Windows 用の Node.js (node.exe) を一般ユーザ権限で使ってみています. (インストーラは使わず,node.exe を直接ダウンロードして使っています.  npm や nvm は使用しません) コマンドプロンプトから実行して,使えるマシンもあるのですが,一部のマシンでは 起動直後に「Windowsソケットエラー:無効な引数が提供されました。(10022)」という メッセージが出て,すぐに停止してしまいます. 何か設定が必要なのでしょうか.どなたかご教示頂ければ幸甚です. よろしくお願いいたします. なお,OSはいずれも Windows7 で,node.exe は v0.8.20 です.

  • ドメインをまたぐajax

    サーバA(A.com)に <script type="text/javascript" src="http://B.com/"></script> サーバB(B.com)のajax上に object oj = new ActiveXObject("Msxml2.XMLHTTP") ; oj.open(method,url,async,user,password); でajaxを利用しようとしたところ、 上記のoj.openでエラーとなってしまいます。 ローカル上に両方置いてテストしたときはエラーは起きないのですが、 ドメインをまたぐ場合はエラーとなります。 ajaxでドメインをまたぐのはセキュリティ上使用できないのでしょうか?

    • ベストアンサー
    • AJAX
  • AJAXの書き方について

    <script type="text/javascript"> $( function() { $( '#ajax-button' ) .click( function() { $.ajax({ url: 'http://localhost:8080/app/family', type:'GET', data: {test1 : 'aaa', test2 : 'bbb' }, dataType: 'jsonp', success: function(data) { alert("ok"); }, error: function(XMLHttpRequest, textStatus, errorThrown) { alert("ng"); } }); }); } ); </script> この部分は何を意味しているのでしょうか? $( '#ajax-button' ) .click( またここの部分をIDにして二つ別々のIDを書いてblur(fn()にしたい場合はどうすればいいのでしょうか? $("[id$=NO]").blur(function(){ $("[id$=NM]").blur(function(){ function() { $.ajax({ url: 'http://localhost:8080/app/family', type:'GET', data: {test1 : 'aaa', test2 : 'bbb' }, dataType: 'jsonp', success: function(data) { alert("ok"); }, error: function(XMLHttpRequest, textStatus, errorThrown) { alert("ng"); } }); }); }); }); このようにしても動きません。 正しい書き方を教えていただきたいです。

専門家に質問してみよう