我无法从 json 获取哈巴狗变量的信息。 handlebars 可以看到信息,pug 看不到。但代码相同
I can't get information from json to pug variables. Handlebars can see information, pug can't see. but code the same
我无法从 json 获取哈巴狗变量的信息。哈巴狗知道 json 中有多少个元素。但看不到标题、价格等。如果我使用 Handlebars,而不是哈巴狗 - 代码有效!!!我不明白为什么 Handlebars 会起作用。哈巴狗不工作。我尝试像这样使用 p #{price} 和像这样 p=price。我不知道是什么问题...
index.js
const express = require('express')
const app = express()
const path = require('path')
const pug = require('pug')
//const homeRoutes = require('./routes/home')
//const addRoutes = require('./routes/add')
const coursesRoutes = require('./routes/courses')
app.set('view engine', 'pug')
app.set('views', './views')
app.use(express.static('public'))
app.use(express.urlencoded({extended: true}))
app.use('/', homeRoutes)
app.use('/add', addRoutes)
app.use('/courses', coursesRoutes)
const PORT = process.env.PORT || 3000
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`)
})
courses.js(路由器)
const {Router} = require('express')
const Course = require('../models/course')
const router = Router()
router.get('/', async (req, res) => {
const courses = await Course.getAll()
res.render('courses', {
title: 'Курсы',
isCourses: true,
courses
})
})
module.exports = router
course.js(型号)
const { v4: uuid } = require('uuid');
const fs = require('fs')
const path = require('path')
class Course {
constructor(title, price, img) {
this.title = title
this.price = price
this.img = img
this.id = uuid()
}
toJSON() {
return {
title: this.title,
price: this.price,
img: this.img,
id: this.id
}
}
async save() {
const courses = await Course.getAll()
courses.push(this.toJSON())
return new Promise((resolve, reject) => {
fs.writeFile(
path.join(__dirname, '..', 'data', 'courses.json'),
JSON.stringify(courses),
(err) => {
if (err) {
reject(err)
} else {
resolve()
}
}
)
})
}
static getAll() {
return new Promise((resolve, reject) => {
fs.readFile(
path.join(__dirname, '..', 'data', 'courses.json'),
'utf-8',
(err, content) => {
if (err) {
reject(err)
} else {
resolve(JSON.parse(content))
}
}
)
})
}
}
module.exports = Course
courses.js上
[{"title":"Angular 8","price":"12000","img":"https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Angular_full_color_logo.svg/1200px-Angular_full_color_logo.svg.png","id":"8ae92db5-97f4-494c-ade8-a258d931d61e"},{"title":"Vue JS","price":"20000","img":"https://upload.wikimedia.org/wikipedia/commons/thumb/9/95/Vue.js_Logo_2.svg/1200px-Vue.js_Logo_2.svg.png","id":"b56de685-9bdf-4c4b-8302-80ad480732ef"},{"title":"erere","price":"1212","img":"232","id":"02787dc5-0ca2-4329-8acf-41b576981e3a"}]
courses.pug
block content
<h1>courses page</h1>
if courses.length
each cours in courses
.row
.col.s6.offset-s3
.card
.card-image
img(src="#{img}")
.card-content
span.card-title #{title}
p.price #{price}
.card-action
a(href="/courses/#{id}") Open course
else
p there are not courses
但如果我使用 Handlebars。不是哈巴狗——代码有效!!!
{{#if courses.length}}
{{#each courses}}
<div class="row">
<div class="col s6 offset-s3">
<div class="card">
<div class="card-image">
<img src="{{img}}" alt="{{title}}">
</div>
<div class="card-content">
<span class="card-title">{{title}}</span>
<p class="price">{{price}}</p>
</div>
<div class="card-action">
<a href="/courses/{{id}}">Open course</a>
</div>
</div>
</div>
</div>
{{/each}}
{{else}}
<p>There are nor courses</p>
{{/if}}
what i see if i use pug
what i see if i use handlebars
迭代内部,可以引用迭代变量(cours
)。
您不能通过名称(作为变量)直接引用其属性。
您必须使用 属性 访问器(点或方括号)。
block content
<h1>courses page</h1>
if courses.length
each cours in courses
.row
.col.s6.offset-s3
.card
.card-image
img(src="#{cours.img}")
.card-content
span.card-title #{cours.title}
p.price #{cours.price}
.card-action
a(href="/courses/#{cours.id}") Open course
else
p there are not courses
我无法从 json 获取哈巴狗变量的信息。哈巴狗知道 json 中有多少个元素。但看不到标题、价格等。如果我使用 Handlebars,而不是哈巴狗 - 代码有效!!!我不明白为什么 Handlebars 会起作用。哈巴狗不工作。我尝试像这样使用 p #{price} 和像这样 p=price。我不知道是什么问题...
index.js
const express = require('express')
const app = express()
const path = require('path')
const pug = require('pug')
//const homeRoutes = require('./routes/home')
//const addRoutes = require('./routes/add')
const coursesRoutes = require('./routes/courses')
app.set('view engine', 'pug')
app.set('views', './views')
app.use(express.static('public'))
app.use(express.urlencoded({extended: true}))
app.use('/', homeRoutes)
app.use('/add', addRoutes)
app.use('/courses', coursesRoutes)
const PORT = process.env.PORT || 3000
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`)
})
courses.js(路由器)
const {Router} = require('express')
const Course = require('../models/course')
const router = Router()
router.get('/', async (req, res) => {
const courses = await Course.getAll()
res.render('courses', {
title: 'Курсы',
isCourses: true,
courses
})
})
module.exports = router
course.js(型号)
const { v4: uuid } = require('uuid');
const fs = require('fs')
const path = require('path')
class Course {
constructor(title, price, img) {
this.title = title
this.price = price
this.img = img
this.id = uuid()
}
toJSON() {
return {
title: this.title,
price: this.price,
img: this.img,
id: this.id
}
}
async save() {
const courses = await Course.getAll()
courses.push(this.toJSON())
return new Promise((resolve, reject) => {
fs.writeFile(
path.join(__dirname, '..', 'data', 'courses.json'),
JSON.stringify(courses),
(err) => {
if (err) {
reject(err)
} else {
resolve()
}
}
)
})
}
static getAll() {
return new Promise((resolve, reject) => {
fs.readFile(
path.join(__dirname, '..', 'data', 'courses.json'),
'utf-8',
(err, content) => {
if (err) {
reject(err)
} else {
resolve(JSON.parse(content))
}
}
)
})
}
}
module.exports = Course
courses.js上
[{"title":"Angular 8","price":"12000","img":"https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Angular_full_color_logo.svg/1200px-Angular_full_color_logo.svg.png","id":"8ae92db5-97f4-494c-ade8-a258d931d61e"},{"title":"Vue JS","price":"20000","img":"https://upload.wikimedia.org/wikipedia/commons/thumb/9/95/Vue.js_Logo_2.svg/1200px-Vue.js_Logo_2.svg.png","id":"b56de685-9bdf-4c4b-8302-80ad480732ef"},{"title":"erere","price":"1212","img":"232","id":"02787dc5-0ca2-4329-8acf-41b576981e3a"}]
courses.pug
block content
<h1>courses page</h1>
if courses.length
each cours in courses
.row
.col.s6.offset-s3
.card
.card-image
img(src="#{img}")
.card-content
span.card-title #{title}
p.price #{price}
.card-action
a(href="/courses/#{id}") Open course
else
p there are not courses
但如果我使用 Handlebars。不是哈巴狗——代码有效!!!
{{#if courses.length}}
{{#each courses}}
<div class="row">
<div class="col s6 offset-s3">
<div class="card">
<div class="card-image">
<img src="{{img}}" alt="{{title}}">
</div>
<div class="card-content">
<span class="card-title">{{title}}</span>
<p class="price">{{price}}</p>
</div>
<div class="card-action">
<a href="/courses/{{id}}">Open course</a>
</div>
</div>
</div>
</div>
{{/each}}
{{else}}
<p>There are nor courses</p>
{{/if}}
what i see if i use pug
what i see if i use handlebars
迭代内部,可以引用迭代变量(cours
)。
您不能通过名称(作为变量)直接引用其属性。
您必须使用 属性 访问器(点或方括号)。
block content
<h1>courses page</h1>
if courses.length
each cours in courses
.row
.col.s6.offset-s3
.card
.card-image
img(src="#{cours.img}")
.card-content
span.card-title #{cours.title}
p.price #{cours.price}
.card-action
a(href="/courses/#{cours.id}") Open course
else
p there are not courses