【发布时间】:2022-02-15 03:37:48
【问题描述】:
我想在“edit=true”时呈现带有预填充数据的表单,否则只是重定向我。但是我不断被重定向并收到控制台错误“无法读取未定义的属性(读取“标题”)”,这发生在我的 pug 文件中的价格、imagUrl 等
管理 Js 文件夹
const Product = require('../models/product');
exports.getAddProduct = (req, res, next) => {
//res.render(path.join(rootDir, 'views', '/add-product.pug'))
res.render('admin/edit-product',
{pageTitle: 'Add Product',
path: '/admin/add-product',
editing: false
});
}
exports.postAddProduct= (req, res, next) => {
const title = req.body.title;
const imageUrl = req.body.imageUrl;
const price = req.body.price;
const description = req.body.description;
const product = new Product(title, imageUrl, description, price);
product.save();
res.redirect('/');
};
exports.getEditProduct = (req, res, next) => {
const editMode = req.query.edit;
if (!editMode) {
return res.redirect('/');
}
const prodId = req.params.productId;
Product.findById(prodId, product => {
if (!product) {
res.redirect('/')
}
res.render('admin/edit-product',
{pageTitle: 'Edit Product',
path: '/admin/edit-product',
editing: editMode,
product: product
});
});
};
exports.getProducts = (req, res, next) => {
Product.fetchAll((products) => {
res.render('admin/products', {
prods: products,
pageTitle: 'Admin Products',
path: '/admin/products'
});
});
}
products.js 文件
const fs = require('fs');
const path = require('path');
const products = [];
const p = path.join(
path.dirname(process.mainModule.filename),
'data',
'products.json'
);
const getProductsFromFile = cb => {
fs.readFile(p, (err, fileContent) => {
if (err) {
cb([]);
} else {
cb(JSON.parse(fileContent));
}
});
};
module.exports = class Products {
constructor(title, imageUrl, description, price) {
this.title = title;
this.imageUrl = imageUrl;
this.description = description;
this.price = price;
}
save() {
this.id = Math.random().toString();
getProductsFromFile(products => {
products.push(this);
fs.writeFile(p, JSON.stringify(products), (err) => {
console.log(err);
});
});
};
static fetchAll(cb) {
getProductsFromFile(cb)
}
static findById(id, cb) {
getProductsFromFile(products => {
const product = products.find(p => p.id === id);
cb(product);
})
}
};
edit-product.pug
extends ../layouts/main-layout.pug
block styles
link(rel="stylesheet", href="/css/product.css")
link(rel="stylesheet", href="/css/forms.css")
block content
main
.main-form
if editing
form(action="/admin/edit-product", method="POST")
.main-input
label(for="title") Title
input(type="text", name="title", placeholder="Search Product", value=product.title)
.main-input
label(for="imageUrl") Image URL
input(type="url", name="imageUrl", id="imageUrl", value=product.imageUrl)
.main-input
label(for="price") Price
input(type="number", name="price", id="price", step="0.01", value=product.price)
.main-input
label(for="description", value=product.description) Description
textarea(name="description", id="description", rows="5")
.main-button
if editing
button.btn(type="submit") Update Product
else
button.btn(type="submit") Add Product
else
form(action="/admin/add-product", method="POST")
.main-input
label(for="title") Title
input(type="text", name="title", placeholder="Search Product")
.main-input
label(for="imageUrl") Image URL
input(type="url", name="imageUrl", id="imageUrl")
.main-input
label(for="price") Price
input(type="number", name="price", id="price", step="0.01")
.main-input
label(for="description") Description
textarea(name="description", id="description", rows="5")
.main-button
if editing
button.btn(type="submit") Update Product
else
button.btn(type="submit") Add Product
product.pug 文件
extends ../layouts/main-layout.pug
block styles
link(rel="stylesheet", href="/css/main.css")
link(rel="stylesheet", href="/css/card.css")
block content
main
if prods.length > 0
.grid
each product in prods
article.product-item
header.card__header
h1.product__title #{product.title}
.card__image
img(src=`${product.imageUrl}`
alt="#{product.title}")
.card__content
h2.product__price #{product.price}
p.product__description #{product.description}
.card__actions
a(href="/admin/edit-product/:product.id:?edit=true") Edit
form(action="/admin/delete-product" method="POST")
.btn
button(class="btn", type="submit") Remove
else
h1 No Product
请密切注意 products.pug 文件中我的“a”标签。我认为这就是问题所在。格式可能会尝试遵循把手教程,他们可以在文件中设置查询参数,但在哈巴狗中我猜它不同
【问题讨论】:
-
请修剪您的代码,以便更容易找到您的问题。请按照以下指南创建minimal reproducible example。
标签: javascript node.js express pug