pug.compile() 找不到模板文件(res.render() 可以)

len*_*klb 1 node.js express pug

我正在编写一个小型 NodeJS/Express 应用程序。我将哈巴狗设置为其模板引擎:

const app = express();

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

res.render()当调用 a发送 HTML 响应时,这可以正常工作:

app.get('/', function getIndex(req, res){
    res.render('index.pug');
});
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试渲染小组件并将它们收集在字符串或数组中作为对 AJAX 调用的响应时,我无法让它工作。

const pug = require('pug');
const compile = pug.compileFile('option.pug');
Run Code Online (Sandbox Code Playgroud)

这总是会导致Error: ENOENT: no such file or directory, open 'option.pug'. 我尝试更改路由器视角的路径(类似于../../public/views/option.pug),但这也没有帮助。

我不知道为什么路径的解释不同。

使用时如何引用该模板pug.compileFile

ski*_*tle 6

filename从Pug源代码中,传递的路径在选项中设置为:

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

然后将其传递给handleTemplateCache读取文件:

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

因此最终路径只是传递给fs.readFileSync,它将相对路径视为相对于当前工作目录process.cwd()

您可以使用如下方式生成适当的路径:

const file = app.get('views') + '/option.pug';
Run Code Online (Sandbox Code Playgroud)

最好使用path.join而不是字符串连接来构建路径,https://nodejs.org/api/path.html#path_path_join_paths

const path = require('path');
const file = path.join(app.get('views'), 'option.pug');
Run Code Online (Sandbox Code Playgroud)

如果您不想(或不能)使用,app.get('views')您可以通过其他方式构建绝对路径,例如__dirname直接使用。

另请注意,您可以传递一个回调res.render,将渲染的 HTML 传递给该回调,而不是将其写入响应。这可能会让您避免首先直接调用模板。