我正试图让我的网站在每页的购物篮图标处显示购物篮中的物品数量



我正在使用node.js和EJS构建一个电子商务网站,我正在尝试获得它,以便在每个页面上显示购物篮中的金额。我在下面有一个函数,它显示其中一页的金额,但不显示其他页的金额。

function getBasketItems(req, res, callback) {
db.query('SELECT * FROM basketitems WHERE customerID = ?', [req.session.username], (err, res) => {
if (err) {
callback(err, null);
} else {
var amount = res.length;
callback(null, amount);
}
})
}

功能在这里工作:

router.get('/pens', (req, res) => {
let title = 'Pens | Giraffe Website';
let header = 'Pens';
let sql = 'SELECT * FROM products';
let basketAmount = 0;
getBasketItems(req, res, (err, data) => {
if (err) {
console.log(err)
} else {
basketAmount = data;
}
});
db.query(sql, (err, result) => {
if (err) throw err;
res.render('products', {
title: title,
header: header,
data: result,
username: req.session.username,
loggedin: req.session.loggedin,
basketAmount: basketAmount
});
})
});

但不在此:

router.get('/', (req, res) => {
let title = 'Home | Giraffe Website';
let basketAmount = 0;
getBasketItems(req, res, (err, data) => {
if (err) {
console.log(err)
} else {
basketAmount = data;
}
});
res.render('index', {
title: title,
username: req.session.username,
loggedin: req.session.loggedin,
basketAmount: basketAmount
});
})

这是GitHub Repo-https://github.com/shiney1884/giraffe-website如有任何帮助,我们将不胜感激,谢谢!

在第一种情况下,只要有多个到DB的连接,它就可以工作,这纯粹是运气。为了解决这个问题(以及将来类似的问题(,我认为首先了解Javascript和异步操作的概念会很好。

基本教程可以在这里找到https://www.javascripttutorial.net/javascript-callback/通过这些,想象一下setTimeout就是db.query

第二个代码片段的问题是,它在getBasketItems返回响应之前执行,因为它是同步执行的。您可以将getBasketItems承诺为:

function getBasketItems(req, res) {
return new Promise((resolve, reject) => {
db.query('SELECT * FROM basketitems WHERE customerID = ?', [req.session.username], (err, res) => {
if (err) {
reject(err)
} else {
var amount = res.length
resolve(amount)
}
})
})
}

然后将其与async/await:一起使用

router.get('/', async (req, res) => {
let title = 'Home | Giraffe Website';
let basketAmount = 0;
let basketAmount = await getBasketItems(req, res)
res.render('index', {
title: title,
username: req.session.username,
loggedin: req.session.loggedin,
basketAmount: basketAmount
});
})

希望能有所帮助!

最新更新