Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我试图让我的网站在每页的篮子图标上显示篮子中的物品数量_Javascript_Node.js_Ejs_E Commerce - Fatal编程技术网

Javascript 我试图让我的网站在每页的篮子图标上显示篮子中的物品数量

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

我正在用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回购协议-
任何帮助都将不胜感激,谢谢

在第一种情况下,只要一个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