Javascript 我试图让我的网站在每页的篮子图标上显示篮子中的物品数量
我正在用node.js和EJS构建一个电子商务站点,我正在尝试获取它,以便在每个页面上显示篮子中的数量。我在下面有一个函数,它可以显示其中一页上的金额,但不能显示其他页上的金额Javascript 我试图让我的网站在每页的篮子图标上显示篮子中的物品数量,javascript,node.js,ejs,e-commerce,Javascript,Node.js,Ejs,E Commerce,我正在用node.js和EJS构建一个电子商务站点,我正在尝试获取它,以便在每个页面上显示篮子中的数量。我在下面有一个函数,它可以显示其中一页上的金额,但不能显示其他页上的金额 function getBasketItems(req, res, callback) { db.query('SELECT * FROM basketitems WHERE customerID = ?', [req.session.username], (err, res) => { i
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回购协议-
任何帮助都将不胜感激,谢谢 在第一种情况下,只要一个DB有多个连接,它就可以工作,这纯粹是运气。 为了解决这个问题(以及将来类似的问题),我认为首先了解Javascript和异步操作的概念会对您有好处 基本教程可以在这里找到
在这里,只要想象一下
setTimeout
是一个db.query
第二个代码片段的问题是,它是在getBasketItems
返回响应之前执行的,因为它是同步执行的。您可以承诺getBasketItems
如下:
函数getBasketItems(请求、恢复){
返回新承诺((解决、拒绝)=>{
db.query('SELECT*FROM basketitems,其中customerID=?',[req.session.username],(err,res)=>{
如果(错误){
拒绝(错误)
}否则{
var金额=分辨率长度
决议(金额)
}
})
})
}
谢谢!这很有效。上次我试图让异步函数正常工作时,我尝试了异步函数,但未能正常工作。我需要研究这个,听起来不错。请接受答案。好的,谢谢,我们会调查的!在第一种情况下,您有两个异步操作getBasketItems
和db.query
,但是当我们确定只有db.query
完成时,将调用render
。如果getBasketItems
在db.query
之后完成,则不会设置basketAmount
。