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

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

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

DOMは、Document Object Modelの略で、HTML文書やXML文書をアプリケーションから利用するためのAPIです。

JavaScript

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

Q&A

解決済

1回答

2265閲覧

index.html内のテキストをapp.jsで書き換え、ローカルサーバー上に反映させたい(DOM)

maskmelon

総合スコア63

DOM

DOMは、Document Object Modelの略で、HTML文書やXML文書をアプリケーションから利用するためのAPIです。

JavaScript

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

0グッド

0クリップ

投稿2020/06/15 18:06

前提・実現したいこと

index.html内のテキストをapp.jsで書き換え、ローカルサーバー上に反映させたい。

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

ローカルサーバーを立ち上げると下記のエラーメッセージが表示されます。

document.querySelector('p').innerText = 'Goodbye'; ^ ReferenceError: document is not defined at Object.<anonymous>

該当のソースコード

html

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 7 <title>StopWatch</title> 8</head> 9<body> 10 <p>Hello</p> 11 <script src="app.js"></script> 12</body> 13</html>

javascript

1const express = require('express'); 2 3const app = express(); 4 5app.get("/", function (req, res) { 6 res.sendFile(__dirname + "/index.html") 7}); 8 9app.listen(3001, ()=>{ 10 console.log("Server is runnning"); 11}); 12 13document.querySelector('p').innerText = 'Goodbye';

試したこと

index.htmlをブラウザに貼り付けて、app.jsにdocument.querySelector('p').innerText = 'Goodbye';と記入した状態で、更新ボタンを押すと、HelloがGoodbyeに書き換わるのですが、ローカルサーバーを立ち上げるとクラッシュしてしまうのは何故でしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

ローカルサーバーを立ち上げるとクラッシュしてしまうのは何故でしょうか?

NodeJS(サーバー側)のJavaScript内に、ブラウザ側のJavaScriptを記述しているためです。


NodeJS(express など)では サーバー側 / クライアント側 を見極めるために HTTP/1.1 における クライアント-サーバー間の情報のやりとりを把握し、コードを書き分ける必要があります。 シーケンス図(HTTP/1.1) (Codepen:他の回答でも示した為PHPの表現があります)において、 Browserの線上では「ブラウザ側の JavaScript」が、Serverの線上では 「NodeJS(サーバー側)の JavaScript」が動きます。

ご質問からは、expressjs で hello world を試し、静的ファイルの応答 として index.html を試してみた段階と思いますが、*.css, *.js などの複数ファイルを応答するには express.static(Google検索) ミドルウェアを活用してください(あるいは、index.html にインラインスクリプトを書いて結果を試すこともできます)。


まずは、公式にも紹介される Expressジェネレータ(公式ドキュメント)を使って環境構築し、静的ファイルを公開用ディレクトリ(public 以下の階層)に応答用ファイルを配備して確認してみてください。

以下、自動生成される内容とは若干違いますが、NodeJS用 / ブラウザ用 を見分けやすいディレクトリ構成になるはずです。

+- dir/ app.js ... NodeJS (サーバー用 javascript) +- public/ index.html ... 応答する *.html ファイル script.js .... 応答する *.js ファイル(*.html 内で指定されるブラウザ用JavaScript)

投稿2020/06/15 20:43

AkitoshiManabe

総合スコア5432

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

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

maskmelon

2020/06/16 05:09 編集

ディレクトリ構成を変更したところ、script.jsの処理をブラウザ上に反映させることができました。サーバー側とクライアント側の処理の書き分けについて理解することができました。大変分かりやすい回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問