PugJS如何访问locals数据?模板语法报错问题咨询
问题原因及解决方案
首先,你遇到的语法错误核心原因是在Pug的逻辑代码块(比如if条件判断)里错误使用了插值语法#{}。
为什么会报错?
Pug的插值语法#{variable}是专门用来在文本内容中插入变量值的,比如你在<title>标签里的用法是对的。但在逻辑代码(比如if、else、循环语句)中,Pug会直接解析变量名,不需要额外的插值包裹——#{}在这里属于多余的语法,会被Pug解析器当成意外字符,所以抛出了语法错误。
除此之外,你的Express代码里还有一个容易忽略的问题:手动调用pug.compileFile不是Express渲染Pug模板的正确方式,而且你传递数据的位置也错了——compileFile的第二个参数是编译选项(比如是否美化输出),不是模板要使用的数据,模板数据应该在调用编译生成的函数时传入。
修正后的代码示例
1. 修正Express的路由代码(main.js)
Express已经内置了模板引擎的支持,直接用res.render()就可以完成模板渲染和数据传递,不需要手动调用Pug的编译方法:
const express = require('express'); const app = express(); // 设置Pug为模板引擎 app.set('view engine', 'pug'); // 设置模板文件的目录(默认就是views,这里显式指定确保路径正确) app.set('views', __dirname + '/views'); const defaultUser = { isAnonymous: true, name: 'test' }; app.get('/', (req, res) => { // 用res.render渲染模板,第二个参数就是传递给模板的数据 res.render('index', defaultUser); }); app.listen(3000, () => { console.log('Server running on port 3000'); });
2. 修正Pug模板代码(index.pug)
去掉if条件里的#{},直接使用变量名:
doctype html html head if isAnonymous title Test page else title #{name} - Test page
额外说明
- 在Pug中,逻辑代码行(比如
if、-开头的代码)直接写变量即可访问传递的数据; - 只有当你需要在纯文本或者HTML属性中插入变量值时,才需要用
#{}(不过HTML属性里也可以省略#{},直接写title= name这种形式,Pug会自动处理)。
内容的提问来源于stack exchange,提问作者Khryus




