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

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

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

npmは、Node Packaged Modulesの略。Node.jsのライブラリ・パッケージを管理できるツールです。様々なモジュールを簡単にインストールでき、自分でモジュールを作成し公開する際にも使用できます。

Node.js

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

Express

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

Q&A

解決済

3回答

5788閲覧

EJS <%- filename %> が使えない

HiroFumi

総合スコア11

npm

npmは、Node Packaged Modulesの略。Node.jsのライブラリ・パッケージを管理できるツールです。様々なモジュールを簡単にインストールでき、自分でモジュールを作成し公開する際にも使用できます。

Node.js

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

Express

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

0グッド

0クリップ

投稿2017/11/16 01:48

編集2017/11/16 02:54

EJS express を使った以下環境にて。
<%- filename %> でファイル名を取得したいのですが、filename が定義されていないというエラーが出てしまいます。
因みに、EJS express ともに動作は問題なく <%- filename %> のみ取得出来ない状況です。

どなたか教えていただけませんでしょうか。

node v9.1.0
npm 5.5.1
ejs 2.5.7
express 4.16.2

test
├── node_modules
├── package-lock.json
├── package.json
├── views
│ ├── index.ejs

├── home.html
├── index.js 

###エラーメッセージ
以下コマンド実行時にエラー発生。

$ node index.js

filename is not defined at eval (eval at compile (/Users/xxxxxx/Desktop/test/node_modules/ejs/lib/ejs.js:549:12), <anonymous>:23:17) at returnedFn (/Users/xxxxxx/Desktop/test/node_modules/ejs/lib/ejs.js:580:17) at tryHandleCache (/Users/xxxxxx/Desktop/test/node_modules/ejs/lib/ejs.js:223:34) at View.exports.renderFile [as engine] (/Users/xxxxxx/Desktop/test/node_modules/ejs/lib/ejs.js:437:10) at View.render (/Users/xxxxxx/Desktop/test/node_modules/express/lib/view.js:135:8) at tryRender (/Users/xxxxxx/Desktop/test/node_modules/express/lib/application.js:640:10) at Function.render (/Users/xxxxxx/Desktop/test/node_modules/express/lib/application.js:592:3) at ServerResponse.render (/Users/xxxxxx/Desktop/test/node_modules/express/lib/response.js:1008:7) at ReadFileContext.fs.readFile [as callback] (/Users/xxxxxx/Desktop/test/index.js:29:11) at FSReqWrap.readFileAfterOpen [as oncomplete] (fs.js:43

###該当のソースコード

■ /views/index.ejs

<html lang="ja"> <head> <meta charaset="utf-8"/> <meta name="viewport" content="width=device-width,initial-scale=1"/> <title><%= tit %> - サイト名</title> </head> <body> <%- filename %> <h1><%= tit %> - サイト名</h1> <%- lst %> <hr/> <%- con %> <hr/> <center><small>著作権表記</small></center> </body> </html>

■ index.js

"use strict"; const express = require('express'); const app = express(); const fs = require('fs'); app.set('port', (process.env.PORT || 5000)); app.set('views', __dirname + '/views'); app.set('view engine', 'ejs'); fs.readdir('./txt/', (err, files)=>{ let idx = '<a href="/">home</a>'; files.forEach( (v,i,a)=>{ if (v.match(/^(?!.).+$/i)) { idx += ' | <a href="/'+v+'">'+v+'</a>'; } }); app.get('/', (req, res)=>{ fs.readFile('./home.html', 'utf8', (err,text)=>{ res.render('index', {tit : 'home', con : text, lst : idx}); }); }); app.get('/:id', (req, res)=>{ const ttl = req.params.id; fs.readFile('./txt/'+ttl, 'utf8', (err,text)=>{ res.render('index', {tit : ttl, con : text, lst : idx}); }); }); }); app.listen(app.get('port'), ()=>{ console.log("running at localhost:" + app.get('port')) });

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

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

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

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

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

date

2017/11/16 02:02

index.js内のfilenameの処理がどうなっているか分からないので、index.jsのファイル内容を入れてもらえますか?
HiroFumi

2017/11/16 02:55

早速の返答ありがとうございます。 只今追記させていただきました。 特に filename は、定義しておりません。 以下のように filename には、ファイルパスが格納されているのではないのでしょうか? https://qiita.com/chihirou/items/edcd8d17a687bcbbb15c
guest

回答3

0

filenameとは今回の場合「index.ejs」が表示されるようにしたいということでしょうか?

ファイル名ではなくurlのパスから取得する方法はあるみたいですので参考にして見てください。
https://php-fan.org/jquery-get-filename.html

ちなみに、index.ejsのみで自分のファイル名を取得するのはできなさそうかなと。。。

投稿2017/11/23 01:31

TomokazuKozuma

総合スコア131

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

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

HiroFumi

2017/11/28 03:41

返答遅くなりました。 可能でしたらサーバーサイドで実装したかったのですが、今回は参照サイトのようにフロント側で実装しました。。 ありがとうございます!!
guest

0

ベストアンサー

gulp-ejsでの機能だったはずなので、gulp-ejsを通さないと使えないはず

投稿2017/11/16 04:03

rururu3

総合スコア5545

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

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

HiroFumi

2017/11/16 13:03

ありがとうございます。 gulpを使わずにファイル名を取得するにはどうすればよろしいでしょうか。 可能ならサーバー側ではなく、index.ejs内で取得したいのですが。
guest

0

<%= filename %>

現在の<%- filename %>を<%= filename %>にしてみて下さい。
URL先の例もそのようになっています。
今現在の書き方だと
{tit : ttl, con : text, lst : idx}
に入っているfilenameを参照していますのでfilename is not definedとなってしまいます。

投稿2017/11/16 03:14

編集2017/11/16 03:15
date

総合スコア1820

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

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

HiroFumi

2017/11/16 03:31

<%= filename %> こちらに修正してみましたが、同様のエラーメッセージが出てしまいます。 index.js 内を {tit : ttl, con : text, lst : idx, filename: 'test'} のように、filenameを追加しますと、<%= filename %>で test が表示されますので、やはりindex.js内のfilenameを参照しているようです。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問