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?
filename从Pug源代码中,传递的路径在选项中设置为:
然后将其传递给handleTemplateCache读取文件:
因此最终路径只是传递给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 传递给该回调,而不是将其写入响应。这可能会让您避免首先直接调用模板。
| 归档时间: |
|
| 查看次数: |
2829 次 |
| 最近记录: |