Я создаю проект Node.js (из курса Udemy) и получаю эту ошибку, когда нажимаю кнопку «Подробнее»:
Описание проблемы
После некоторой отладки и проверки подобных обсуждений вопросов и ответов я обнаружил, что проблема возникает только тогда, когда я использую фиктивный текст (например, abc) в imageUrl поле при добавлении продукта.
Если я предоставляю действительный URL-адрес изображения (например, фактическую ссылку на изображение), все работает нормально.
В одном из ответов на вопросы кто-то упомянул, что это может быть связано с вторым запросом или чем-то, связанным с тем, как извлекаются данные о продукте, но я не смог полностью понять причину.
Может кто-нибудь ясно понять? объясните почему это происходит?
Почему это работает, когда я указываю реальный URL-адрес изображения, но выдает ошибку, когда я использую фиктивный текст для imageUrl?
Примечание: Я использую файл JSON (data/product.json) для хранения данных о продукте. Файл обновляется правильно, когда я добавляю продукты, и я вижу, что там сохраняется фиктивный текст imageUrl.
TypeError: Cannot read properties of undefined (reading 'title')
at C:\Users\haris\Desktop\NODEJS\backend-1\controllers\shop.js:19:25
at C:\Users\haris\Desktop\NODEJS\backend-1\models\product.js:48:7
at C:\Users\haris\Desktop\NODEJS\backend-1\models\product.js:15:7
at FSReqCallback.readFileAfterClose [as oncomplete] (node:internal/fs/read/context:68:3)
Node.js v24.4.0
shop.js controller
const Products = require("../models/product.js");
exports.getProducts = (req, res, next) => {
Products.fetchAll((allProduct) => {
res.render("shop/product-list", {
p: allProduct,
docTitle: "All Products",
path: "/products",
});
});
};
exports.getProduct = (req, res, next) => {
const prodId = req.params.productId;
Products.findById(prodId, (product) => {
console.log(product);
res.render("shop/product-detail", {
product: product,
docTitle: product.title,
path: "/products",
});
});
};
exports.getIndex = (req, res, next) => {
Products.fetchAll((allProduct) => {
res.render("shop/index", {
p: allProduct,
docTitle: "Shop",
path: "/",
});
});
};
exports.getCart = (req, res, next) => {
res.render("shop/cart", {
path: "/cart",
docTitle: "Your Cart",
});
};
exports.getOrders = (req, res, next) => {
res.render("shop/orders", {
path: "/orders",
docTitle: "Your Orders",
});
};
exports.getCheckOut = (req, res, next) => {
res.render("shop/checkOut", {
path: "/checkout",
docTitle: "Checkout",
});
};
product.js model
const fs = require("fs");
const path = require("path");
const homePath = require("../utils/path.js");
const p = path.join(homePath, "data", "product.json");
const getProductFromFile = (cb) => {
fs.readFile(p, (err, fileCont) => {
if (err) {
cb([]);
} else {
cb(JSON.parse(fileCont));
}
});
};
module.exports = class Products {
constructor(title, imageUrl, price, description) {
this.title = title;
this.description = description;
this.imageUrl = imageUrl;
this.price = price;
this.id = Math.random().toString();
}
save() {
getProductFromFile((products) => {
products.push(this);
fs.writeFile(p, JSON.stringify(products), (err) => {
console.log(err);
});
});
}
static fetchAll(callback) {
getProductFromFile(callback);
}
static findById(id, cb) {
getProductFromFile((products) => {
const product = products.find((p) => p.id == id);
console.log(id);
cb(product);
});
}
};
product-details.ejs
[img]
Подробнее здесь: https://stackoverflow.com/questions/797 ... using-dumm