1. ホーム
  2. node.js

[解決済み] res.render() が呼び出されたファイルの場所に応じて Express のビューフォルダを変更する。

2023-04-18 17:11:20

質問

res.render()を呼び出したときに、Expressのビューフォルダを変更したいのですが、どうすればいいですか?

例えば、/folder/file.js 内で res.render(viewName) を呼び出した場合、Express は /folder/views 内のビューを探すようにしたいです。

ファイルが /folder1/folder2/file.js の中にある場合、Express は /folder1/folder2/views の中にあるビューを検索するようにしたいです。

それは可能ですか?

どのように解決するのですか?

メソッドを使用することができます。 set() を使ってexpressのデフォルト設定を再定義することができます。

app.set('views', path.join(__dirname, '/yourViewDirectory'));

動的なパスの変更には、次のようなことができます。

var express = require('express');
var path = require('path');
var app = express();

app.engine('jade', require('jade').__express);
app.set('view engine','jade');

app.customRender = function (root,name,fn) {

    var engines = app.engines;
    var cache = app.cache;

    view = cache[root+'-'+name];

    if (!view) {
        view = new (app.get('view'))(name, {
          defaultEngine: app.get('view engine'),
          root: root,
          engines: engines
        });

        if (!view.path) {
          var err = new Error('Failed to lookup view "' + name + '" in views directory "' + root + '"');
          err.view = view;
          return fn(err);
        }

        cache[root+'-'+name] = view;
    }

    try {
      view.render(opts, fn);
    } catch (err) {
      fn(err);
    }
}

app.get('/', function(req, res) {

    app.customRender(path.join(__dirname, '/path/to/user/'),'index',function (err,html) {
        if (err)
            res.send(404);
        else
            res.send(200,html);
    });

});

app.listen(3000);