質問するログイン新規登録
Node.js

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

JavaScript

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

Q&A

解決済

2回答

551閲覧

クライアントサイドのhtmlからnode.jsを起動できない

hatsuzo

総合スコア56

Node.js

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

JavaScript

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

0グッド

0クリップ

投稿2023/10/04 00:44

編集2023/10/04 00:47

0

0

クライアントサイドのhtmlからnode.jsを起動できない

Webアプリでローカル上のファイルをサーバーにアップロード後、ローカルのファイルをリネームしたい要件があり、セキュリティ上は望ましくないとは思いながら、調べていくうちに、node.jsなら出来なくもないという情報を得て、触ったこともないnode.jsをインストールして簡単なアプリを作成してみたのですが、呼び出すことすら出来ずに行き詰っています。
環境の問題なのか、書き方の問題なのかもよく判らず、識者のアドバイスが頂ければ幸いです。

前提

ファイルのリネームの実装はさておき、クライアントサイドのJavascriptからパラメタを与えて、node.jsを動かすところから始めました。

  • 呼出元ページ:g:\myweb\node\index.html
  • 呼出先スクリプト:g:\myweb\node\server.js
  • node.jsのインストール先 g:\node
    set path = g:\node
    set NODE_PATH=g:\node\modules

発生している問題・エラーメッセージ

  • サービスの起動 g:\myweb\server>node server.js
    • サーバーがポート3000で実行中.....
  • ページの起動 http://myserver/myweb/node/index.html
    • ページは正常に表示されるが、ボタン押下により、server.jsを呼び出したところ、エラーが出る。

    • エラー

GET http://192.168.1.244/node/myendpoint 404 (Not Found) Syntax error : Unexpected token '<', "<!DOCTYPE "... is not valid JSON

該当のソースコード

呼出元ページ [index.html]

html

1<html> 2<head> 3 <title>サーバーサイド呼び出し</title> 4</head> 5<body> 6 <button id="callServer">サーバーサイドを呼び出す</button> 7 <div id="response"></div> 8 9 <script> 10 const callServerButton = document.getElementById('callServer'); 11 const responseDiv = document.getElementById('response'); 12 13 callServerButton.addEventListener('click', () => { 14 // サーバーにGETリクエストを送信 15 fetch('/node/myendpoint') 16 .then(response => response.json()) 17 .then(data => { 18 // サーバーからのレスポンスを表示 19 responseDiv.textContent = 'サーバーからのレスポンス: ' + data.message; 20 }) 21 .catch(error => { 22 console.error('エラー:' + error); 23 }); 24 }); 25 </script> 26</body> 27</html> 28
呼出先スクリプト [server.js]

Javascript

1const http = require('http'); 2 3const server = http.createServer((req, res) => { 4 if (req.method === 'GET' && req.url === '/node/myendpoint') { 5 // クライアントからのGETリクエストを処理 6 const responseData = { message: 'サーバーサイドからのレスポンス' }; 7 res.setHeader('Content-Type', 'application/json'); 8 res.end(JSON.stringify(responseData)); 9 } else { 10 res.statusCode = 404; 11 res.end('Not Found'); 12 } 13}); 14 15const PORT = 3000; 16server.listen(PORT, () => { 17 console.log('サーバーがポート ' + PORT + 'で実行中...'); 18}); 19

試したこと

myweb/nodeの中ではなく、myweb/の直下に配置し、ソースも書き換えてみましたが、結果は同じでした。
(ページは表示されるも同じエラーメッセージ)
GET http://myweb/myendpoint 404 (Not Found)

該当のソースコード

呼出元ページ [index.html]

html

1 // サーバーにGETリクエストを送信 2 fetch('/myendpoint')
呼出先スクリプト [server.js]

Javascript

1 if (req.method === 'GET' && req.url === '/myendpoint') {

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

サーバーはWindows2019 で Apacheは2.4, node.jsはを使用しています。
クライアントはWindows10でブラウザはchromeを使用しています。

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

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

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

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

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

maisumakun

2023/10/04 00:51

req.urlの条件を全く外してみる、ということは試してみましたか?
hoshi-takanori

2023/10/04 00:51

node.js は基本的にはサーバー上で動かすものです。node.js に限らず、Web ページからローカルのファイルを勝手にいじることはセキュリティ上できません。
Lhankor_Mhy

2023/10/04 01:12

404が返ってきてるということは else 句に入っているような気がしますね。ログを取ってみてはどうでしょうか。 ところで、server.js でローカルサーバを立ち上げているなら、index.html のリクエストは 404 の方に流れそうな気がしてますが、その辺りは別にコードが書かれている感じですか?
Lhankor_Mhy

2023/10/04 05:23

質問の変更を拝読。 http://192.168.1.244/node/myendpoint に 404 が返ってきてるようですが、server.js はポート3000で起動させてるんじゃなかったでしたっけ……? 省略して書いていますか? もし、この通りであるならば、ローカルサーバを2つ立てていませんか? そして、server.js が立てているサーバとは別のサーバにリクエストを飛ばしていませんか?
hatsuzo

2023/10/04 06:24

maisumakunさん コメント有難うございました。 > req.urlの条件を全く外してみる、ということは試してみましたか? server.jsのIF文をコメントアウトしましたが結果は同じでした。 hoshi-takanoriさん コメント有難うございました。 > node.js は基本的にはサーバー上で動かすものです。 そう思っていたのですが、chatGPTで質問したら、可能です、のような回答が返ってきたので....。 やはりそうなんですね。ただ、後学のためにnode.jsってどんなもの、というのも知っておきたいので調べてみます。 Lhankor_Mhyさん。コメント有難うございました。 >ところで、server.js でローカルサーバを立ち上げているなら、index.html のリクエストは 404 の方に >流れそうな気がしてますが、その辺りは別にコードが書かれている感じですか? これ以上は何もコードを書いていません。 > http://192.168.1.244/node/myendpoint に 404 が返ってきてるようですが、 これは単なる入力間違えです。同じサーバーでwebサーバもnode.jsも起動しています。 ポート3000で起動させているはずです。 でも404はポートとは関係なくhttp?の返すエラーコードだと思っていました。 ログの取り方が判りませんので、もう少し調べてみます。
Lhankor_Mhy

2023/10/04 06:39 編集

> 同じサーバーでwebサーバもnode.jsも起動しています。 これは、「webサーバ 」「node.js」のふたつが起動しているようにも読めますが、そうではなくて、node.jsでwebサーバを起動している、という意味でいいのですよね? 「node.js」とは別に Apache が走っている、とかそういうことではないですよね?
hatsuzo

2023/10/04 08:03

コメント有難うございます。 使い方が判っていないので、意味が分かっていません。 元々、Apacheが動いている環境のhtmlがあり、その状態でnode.jsをサービスとして起動させる形で、コマンドラインから > node server.js と入れて起動していますが、これは二つを起動しているという意味になるのでしょうか?
guest

回答2

0

Webアプリでローカル上のファイルをサーバーにアップロード後、ローカルのファイルをリネームしたい要件

ブラウザからファイルAをサーバーにおくり、ローカルのファイル名をBに変更するという主旨でしょうか?
(正直その運用の必要性を感じませんが)

ブラウザからローカルのファイルを変更することは基本的にできません。あえてやるなら、アップしたファイルを任意に別名でダウンロードさせるくらいなら可能です(ただし既存のファイルに強制的に上書きすることはできません)

投稿2023/10/04 01:48

yambejp

総合スコア117975

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

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

hatsuzo

2023/10/04 06:51

コメント頂きまして有難うございます。 そう思っていたのですが、chatGPTで質問したら、可能です、のような回答が返ってきたので....。 おそらく、ご指摘の別名でダウンロードする方法なら可能、という意味かもしれません。 アップロードしたファイルを何処まで処理したがが判るようにマーキングするためです。 ファイル名を変更してアップロードするので、二重アップロードもありうるからです。 やはりそうなんですね。ただ、後学のためにnode.jsってどんなもの、というのも知っておきたいので調べてみます。
yambejp

2023/10/04 07:02

念のため 「ローカルマシンにサーバーとしてnodeをインストールしてhttpアクセスできる」環境であれば絶対にできないというわけではありません。しかしそんなことするくらいならファイルアップロードはftpを利用し、バッチファイル(もしくはwsh)などで自動処理を実行すれば、リネームまでの一連の処理ができるでしょう
hatsuzo

2023/10/04 08:07

コメント有難うございます。 確かにそうですね。反論するつもりでは決してないですが、そうした方法も少し頭をよぎったのですが、Webの画面をインタフェイスにしたいので、事前のエラーチェックや処理後のステイタスを取得するのが難しいのかなと考えてWeb側でできないかなと思った次第です。
guest

0

ベストアンサー

chatGPTで質問したら、可能です、のような回答が返ってきたので....。

おそらく聞き方が悪かったのでしょう。「JavaScriptでファイルのリネームは出来ますか?」みたいに聞いたのでは?
「Webアプリケーションで、サーバー側のプログラムで何らかの処理をすることで、クライアントPC内のファイルのリネームは出来ますか?」とか「Webアプリケーションで、サーバー側からブラウザに送り込んだjavaScriptプログラムで何らかの処理をすることで、クライアントPC内のファイルのリネームは出来ますか?」とかでしょうか。

出来ないかというと、クライアントPCを自分で管理できるなら可能でしょう。
ブラウザやOSの設定で、特定のMIMEタイプのファイルや、特定のスキーム(注1)のURIを開くと、特定の外部プログラムが起動するようにすることが可能です。そのファイルやURIにファイルリネームの情報を入れて、その自作外部プログラムが受け取り、プログラム内で指示通りにリネームすれば良いかと思います。普通のjavaScriptで該当URIを開いたりすればプログラムが起動するでしょう。
具体的な設定方法は、私はこのあたりは余り詳しくないので調べてみてください。レジストリ修正で、独自スキームを定義して自作プログラムが起動するというのを試しにやってみたことがある程度。
ただまあ、仕組みを知っている人に悪意があると悪さが出来ちゃいますが。

注1:スキームとは、URI先頭の、http: とか ftp: とか mailto: みたいな物のことです。

アップロードしたファイルを何処まで処理したがが判るようにマーキングするためです。ファイル名を変更してアップロードするので、二重アップロードもありうるからです。

この意味が分かりませんが、何らかの別の普通の手段がありそうな気はします。

投稿2023/10/04 12:21

編集2023/10/04 12:35
otn

総合スコア86371

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

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

otn

2023/10/04 12:34

もう少し具体的に書くと、スキームを使う例だと、 1.javascriptで、window.open("hoge:oldname.txt/newname.txt") すると、"C:\hoge.exe hoge:oldname.txt/newname.txt"というコマンドラインでプログラムが起動するようにレジストリを設定 2.「コマンドラインを解析して新旧ファイル名を得て、リネームを実行」という処理をする hoge.exe を作って置いておく。バッチファイルでも良いかも。
hatsuzo

2023/10/11 00:03

コメント有難うございました。 お礼が遅れまして失礼しました。 レジストリを使えば、こんなことができるのですね。なんとか実装はできました。 セキュリティ上問題があるのかもしれませんね。 [HKEY_CLASSES_ROOT\renfn] "URL Protocol"="" [HKEY_CLASSES_ROOT\renfn\shell] [HKEY_CLASSES_ROOT\renfn\shell\open] [HKEY_CLASSES_ROOT\renfn\shell\open\command] @="\"\\\\myserver\\public\\ren_ok.bat\" \"%1\"" [ren_ok.bat] @echo off setlocal enabledelayedexpansion rem パラメータからファイルのフルパスを取得 set "fullpath=%~1" rem フルパスからファイル名だけを取得 for %%i in ("%fullpath%") do set "filename=%%~nxi" rem ファイル名に"(済)"を追加して新しいファイル名を生成 set "newname=(済)!filename!" rem フルパスからファイルのディレクトリを取得 for %%i in ("%fullpath%") do set "filepath=%%~dpi" rem リネーム(重複を回避) set "counter=1" :retry if exist "!filepath!!newname!" ( set "newname=(済)(!counter!)!filename!" set /a "counter+=1" goto retry ) rem リネーム操作を実行 ren "%fullpath%" "!filepath!!newname!" endlocal
otn

2023/10/11 01:05

ブラウザアドオンの開発をすることでも可能かも知れません。アドオンについてあまり調べたことないので、任意のフォルダー内のファイルを操作できるかどうか私は知りません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問