我想让我的网站在每个页面的购物篮图标处显示购物篮中的商品数量

I am trying to get my site to show the amount of items in the basket at the basket icon on each page

我正在使用 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 回购 - https://github.com/shiney1884/giraffe-website 任何帮助将不胜感激,谢谢!

事实上,它在第一种情况下有效,只要与数据库的连接不止一个,这纯粹是运气。 为了解决这个问题(以及将来类似的问题),我认为您最好先了解 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
    });
})

希望对您有所帮助!