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

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

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

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

JavaScript

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

Express

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

Q&A

解決済

2回答

6713閲覧

Express(Node.js)でPublic外のcssやjsファイルを読み込む方法が分かりません。

nullpurge

総合スコア26

Node.js

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

JavaScript

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

Express

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

0グッド

1クリップ

投稿2017/12/19 11:41

###前提
・express-generatorを使用しています。
・ディレクトリ構造↓

. ├── app.js ├── package.json ├── public │ ├── js │ └── index.js │ └── css │ └── index.css ├── admin │ ├── js │ └── admin.js │ └── css │ └── admin.css ├── routes │ └── index.js │ └── admin.js └── views ├── index.pug └── admin.pug

・わたくしミドルウェアの分野ちんぷんかんぷんでございます。
###実現したいこと
adminページを開いた際にadminディレクトリにあるcssとjsを読み込みたい
app.jsとroutes/admin.jsには「'/admin'にpostしたらadmin.pugをレンダリングしていわゆる管理ページを開く」(パスワード認証は便宜上省略)というコードを書いています。

以前までadminのjsファイルがpublicディレクトリ内にあり、「これってセキュリティ的にどうなの?」ということでadminディレクトリに移しました。

ですが、静的ファイルをapp.jsで設定したら

pug

1script(type='text/javascript' src='js/index.js')

といった感じでなぜか知らないけどパスがpublicの直下にいるような感覚で書けるということを仕組みをしらないまま使っていた私は、静的ファイル外のファイルへのアクセス方法を知りません。

どなたかいい方法教えてください~~。。

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

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

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

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

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

guest

回答2

0

自己解決

丁寧に解説してくださった方がいましたが、私の質問が的確でないようで少し誤解を招いてしまったのか、単純に私の理解力不足なのか直接な解決には結び付きませんでした。面目ない・・・。

奇跡的に知人の書いたコードにそのような記述があり、それを参考にして一応解決したのでここに書いておきます

###app.js(サーバーサイド)

js

1var index = require('./routes/index'); 2app.use('/', index);

###routes/admin.js(サーバーサイド)

js

1var express = require('express'); 2var router = express.Router(); 3var path = require('path'); 4 5router.get(/^/admin/, function(req, res, next){ 6 7 res.sendFile( path.resolve('./' + req.url) ); 8 9});

###views/admin.pug(クライアントサイド)

pug

1link(href="/admin/css/manage.css" rel='stylesheet') 2script(type='text/javascript' src='/admin/js/admin.js')

  • 「/admin/~~~」という記述をpug(htmlでも同様)書くとGETメソッドでアクセスして「res.sendFile」でそのファイルを返すんですねぇ~という超半端な理解でとりあえず解決しました。
  • path.resolveを使うとnode_moduleが存在するディレクトリを基準とした相対パスで書けるというのが私にとっては重要なカギでした。
  • もっといい方法がある、ここ間違ってるという箇所あればご指摘お願いします。

投稿2018/01/03 02:48

nullpurge

総合スコア26

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

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

0

node.jsで建てたサーバー内にある画像にアクセスする方法

まず、これが基本です。


adminのjsファイルがpublicディレクトリ内にあり、「これってセキュリティ的にどうなの?」ということでadminディレクトリに移しました。

それは守るべき情報の重さや重要度で設計するべきことです。
そもそも、このadmin.jsとはどんなスクリプトファイルでしょう。
DBのテーブル構成やログインパス等のクリティカルな情報をバンバン載せたスクリプトファイルなのですか?

そうではなくAjax通信を行うコードしか書かれておらず、
ログインにはCookieによるセッションやトークンの仕組みが必要で
万が一漏れたとしても第三者からのアクセスは弾く仕組みになっているのであればあまりシビアに考える必要はありません。

堅牢に作るなら、せっかくのマイクロサービス的な長所を活かせるNode.jsなので、
管理者用のサイトはプロジェクト自体を分離して、別サーバとして8080や30000等のポートでやり取りするといった案もあります。

従って、まず貴方が行うべきことはadmin.jsファイルをpublicディレクトリに設置した人にヒアリングすることです。


どなたかいい方法教えてください~~。。

利用者用(80番ポート)と管理者用(8080番ポート)で分けるのが簡単、わかりやすく、効果も高いのでオススメです。
DB周りの記述が二重になるのでどうやってコピペを防ぐかの設計がエンジニアの腕の見せどころになるかと思います。

既存のまま作るならエンドポイントが1個増える形になるでしょう。
Express 4.x APIあたりを見ながら頑張って実装してください。

JavaScript

1var fs = require('fs'); 2var express = require('express'); 3var app = express(); 4app.use(express.static('public')); 5 6app.get('/admin/admin.js', (req, res) => { 7 // 管理者用画面と同じパスワード認証ロジックを利用する。 8 // クッキーのセッションあたりの確認になるか? 9 res.sendFile(`${__dirname}/admin/admin.js`); 10});

【おまけ】なんとか同じサーバで上手く共用させられないか

エンドポイントで縛る方法があります。
middlewareがぴったりなので、辛いでしょうが解説しますので頑張って読んでください。
app.use([path,] callback [, callback...])

Expressに於けるミドルウェアは、req, res, nextの順番で引数を要求する関数を指します。

JavaScript

1var express = require('express'); 2var app = express(); 3app.use(function (req, res, next) { 4 // リクエストのパスが一致しなかったら勝手に400番エラー返すようにしよう 5 if (req.params.pass === 'my_password') { 6 // 認証出来たリクエストは次へ 7 next(); 8 } else { 9 // 認証失敗したリクエストは400エラー返して殺す 10 res.status(499).end('リクエストは失敗です。'); 11 // nextを実行しなければ自動的にそこで止まる 12 } 13});

これをかっこよく別ファイルに移動するとmiddlewareになります。

JavaScript

1// app.js 2var express = require('express'); 3var my_auth = require('./my_auth.js'); 4var app = express(); 5app.use(my_auth); 6 7// my_auth.js 8module.exports = function (req, res, next) { 9 if (req.params.pass === 'my_password') { 10 next(); 11 } else { 12 res.status(499).end('リクエストは失敗です。'); 13 } 14}

次、app.useは第一引数に文字列を設定出来ます。
admin配下にだけ適用したければ下記のように記載すれば済むでしょう。

JavaScript

1app.use('/admin(/*)?', my_auth);

このようにadmin配下は認証機能を仕込んでおけば、publicディレクトリ配下にadmin/index.jsみたいなファイルが設置してあっても認証が必要になりそうです。

useは上に指定した順番で適用されていくので、
express.staticより前に書けば認証で守れたかと思います(未確認なので検証してみてください)

投稿2017/12/20 06:08

編集2017/12/20 06:27
miyabi-sun

総合スコア21158

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問