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

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

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

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

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

JavaScript

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

Q&A

解決済

1回答

10497閲覧

nodejsでドキュメントルートの指定がしたい

mametaro3

総合スコア13

Node.js

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

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

JavaScript

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

0グッド

0クリップ

投稿2018/12/26 07:30

前提・実現したいこと

nodejsの勉強のためシンプルなwebサーバー作りに挑戦しています。

├── README.md ├── config.js ├── htdocs │   ├── about │   │   └── index.html │   ├── assets │   │   ├── css │   │   │   └── style.css │   │   ├── img │   │   └── js │   ├── company │   │   └── index.html │   └── index.html └── script.js

現在上記の構成で、とりあえずhtdocsをドキュメントルートとしてnodejsを書いていきたいと考えています。

最終的には以下を目標としてサーバーを作っていきたいです。

  • アクセスしたときにいろんなタイプのファイルをきちんと表示できる
  • DBとの連携
  • EXPRESSは使わない

初投稿ですが、アドバイスよろしくお願いいたします。

該当のソースコード

script.js

1//Web サーバーが Listen する IP アドレス 2var LISTEN_IP = '127.0.0.1'; 3//Web サーバーが Listen する ポート 4var LISTEN_PORT = 3000; 5//ファイル名が指定されない場合に返す既定のファイル名 6var DEFAULT_FILE = "index.html"; 7 8var http = require('http'), 9 fs = require('fs'); 10 11//拡張子を抽出 12function getExtension(fileName) { 13 var fileNameLength = fileName.length; 14 var dotPoint = fileName.indexOf('.', fileNameLength - 5); 15 var extn = fileName.substring(dotPoint + 1, fileNameLength); 16 return extn; 17} 18 19//content-type を指定 20function getContentType(fileName) { 21 var extentsion = getExtension(fileName).toLowerCase(); 22 var contentType = { 23 'html': 'text/html', 24 'htm': 'text/htm', 25 'css': 'text/css', 26 'js': 'text/javaScript; charset=utf-8', 27 'json': 'application/json; charset=utf-8', 28 'xml': 'application/xml; charset=utf-8', 29 'jpeg': 'image/jpeg', 30 'jpg': 'image/jpg', 31 'gif': 'image/gif', 32 'png': 'image/png', 33 'mp3': 'audio/mp3', 34 }; 35 var contentType_value = contentType[extentsion]; 36 if (contentType_value === undefined) { 37 contentType_value = 'text/plain'; 38 }; 39 return contentType_value; 40} 41 42//Web サーバーのロジック 43var server = http.createServer(); 44server.on('request', 45 function (request, response) { 46 console.log('Requested Url:' + request.url); 47 var requestedFile = request.url; 48 requestedFile = (requestedFile.substring(requestedFile.length - 1, 1) === '/') ? requestedFile + DEFAULT_FILE : requestedFile; 49 console.log('Handle Url:' + requestedFile); 50 console.log('File Extention:' + getExtension(requestedFile)); 51 console.log('Content-Type:' + getContentType(requestedFile)); 52 fs.readFile('/htdocs' + requestedFile, 'binary', function (err, data) { 53 if (err) { 54 response.writeHead(404, { 55 'Content-Type': 'text/plain' 56 }); 57 response.write('not found\n'); 58 response.end(); 59 } else { 60 response.writeHead(200, { 61 'Content-Type': getContentType(requestedFile) 62 }); 63 response.write(data, "binary"); 64 response.end(); 65 } 66 }); 67 } 68); 69 70server.listen(LISTEN_PORT, LISTEN_IP); 71console.log('Server running at http://' + LISTEN_IP + ':' + LISTEN_PORT);

https://blogs.msdn.microsoft.com/osamum/2015/05/29/web-node-js-web/
↑こちらから拝借したコードです。

試したこと

var requestedFile = request.url;
var requestedFile = '/htdocs' + request.url;に変更したり
他の箇所に'/htdocs'を追加したりしたのですが、イマイチうまくいきませんでした。

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

terminalよりnode script.jsのコマンドでローカルサーバーを起動?しています。
どこかのサイトにはnodejsにはdocumentrootの概念がない、と書かれていました。
こういった問題は、nodejsではなくapatchやnginxなどで解決させるものなのでしょうか?

サーバーの勉強を始めたばかりで、無知でお恥ずかしいのですが、どうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

どこかのサイトにはnodejsにはdocumentrootの概念がない、と書かれていました。

ドキュメントルートというのは、ApacheやNginx等といったソフトウェアで閉じた概念です。
http://example.com//パスを、
ローカルマシンの/var/www/htmlディレクトリに紐づけて静的ファイルを返すようにすれば分かりやすいよねって言ってるだけです。

なのでスクリプト言語にドキュメントルートという概念は存在しません。
Node.jsにもありませんし、PHPやPython、Rubyにもありません。

fs.readFile('/htdocs' + requestedFile, 'binary', function (err, data) {
var requestedFile = request.url;var requestedFile = '/htdocs' + request.url;に変更したり

今回の件はそれとは全く別問題で、単にパスの指定方法を誤ってるだけです。

fs.readFile('/htdocs'で始まっていますが、
Unix/Linuxのパスは/始まりの場合はマシン内のrootディレクトリから探しに行きます。

fs.readFile('./htdocs'の様に、
カレントディレクトリを示す./始まりにすることで動作するでしょう。
ただし、./.はNode.jsを実行した時のカレントディレクトリはコマンドを打ち込んだディレクトリです。

ファイルを示す__dirnameを起点とするか、
npm startコマンドに仕込んで確実にpackage.jsonの階層から始まるようにするというルールを作る必要があります。
fs.readFile(__dirname + '/htdocs' + ...で一度試してみて下さい。

投稿2018/12/26 07:51

編集2018/12/26 07:58
miyabi-sun

総合スコア21158

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

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

mametaro3

2018/12/26 07:55

ありがとうございます! 早い返信で助かりました。 なるほど。お家に帰ってからもう一度試してみます。本当に助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問