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

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

ただいまの
回答率

89.97%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,601

HiroFumi

score 9

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'))
});
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • date

    2017/11/16 11:02

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

    キャンセル

  • HiroFumi

    2017/11/16 11:55

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

    キャンセル

回答 3

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/16 22:03

    ありがとうございます。

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

    キャンセル

0

<%= filename %>


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/16 12:31

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

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/28 12:41

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

    ありがとうございます!!

    キャンセル

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

  • ただいまの回答率 89.97%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る