2017-10-19 8 views
0

私は小さなNodeJS/Expressアプリケーションを書いています。 HTMLレスポンスを送信するためにres.render()を呼び出すときにこれが正常に動作しますpug.compile()はテンプレートファイルを見つけることができません(res.render()can)

const app = express(); 

app.set('view engine', 'pug'); 
app.set('views', __dirname + "/public/views"); 
app.use(express.static(__dirname + '/public/static')); 

:私は、そのテンプレートエンジンとしてパグを設定

app.get('/', function getIndex(req, res){ 
    res.render('index.pug'); 
}); 

しかし、私は小さなコンポーネントをレンダリングして、文字列でそれらを収集しようとしますか、 AJAX呼び出しに対する応答としての配列、私はそれを動作させることはできません。

const pug = require('pug'); 
const compile = pug.compileFile('option.pug'); 

これは常にError: ENOENT: no such file or directory, open 'option.pug'になります。私はルーターの視点(つまり../../public/views/option.pugのようなもの)へのパスを変更しようとしましたが、これも役立ちません。

なぜパスが異なって解釈されるのかわかりません。

pug.compileFileを使用する場合、このテンプレートをどのように参照しますか?パグのソースコードから

答えて

2

は、渡されたパスは、オプションでfilenameとして設定されている:

https://github.com/pugjs/pug/blob/926f7c720112cac76cfedb003e25e9f43d3a1767/packages/pug/lib/index.js#L215

https://github.com/pugjs/pug/blob/926f7c720112cac76cfedb003e25e9f43d3a1767/packages/pug/lib/index.js#L354

は、これは、ファイルを読み取るためにhandleTemplateCacheに渡されます。

これで最終的にパスはfs.readFileSyncに渡されます。fs.readFileSyncは、相対パスを現在の作業ディレクトリの相対パスとして扱います。process.cwd()

あなたはこのような何か使用して、適切なパスを生成できます。そうしないとhttps://nodejs.org/api/path.html#path_path_join_paths

const path = require('path'); 
const file = path.join(app.get('views'), 'option.pug'); 

、パスを構築するためのpath.joinではなく、文字列の連結を使用する方が良いでしょう

const file = app.get('views') + '/option.pug'; 

app.get('views')を使用したい(または使用できない)場合は、__dirnameを直接使用するなど、絶対パスを他の方法で構築することができます。

res.renderにコールバックを渡すことができます。このコールバックは、レスポンスに書き込む代わりにレンダリングされたHTMLに渡されます。これにより、最初にテンプレートを直接呼び出すことを避けることができます。

+0

ご迷惑をおかけしました。これは動作しますが、私はアプリケーションのこの部分を抽象化して問題を回避しました。 –

関連する問題