You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PugJS如何访问locals数据?模板语法报错问题咨询

问题原因及解决方案

首先,你遇到的语法错误核心原因是在Pug的逻辑代码块(比如if条件判断)里错误使用了插值语法#{}

为什么会报错?

Pug的插值语法#{variable}是专门用来在文本内容中插入变量值的,比如你在<title>标签里的用法是对的。但在逻辑代码(比如ifelse、循环语句)中,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

火山引擎 最新活动