我正在使用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
});
})
希望能有所帮助!