尝试将单独的JS文件中的函数链接到我的索引,但部分函数被跳过,返回到index.js app.post方法,最后返回到它跳过的数据库查询另一个JS文件。
销售.js =
const sqlite3 = require('sqlite3').verbose()
const db = new sqlite3.Database('./database/stock.db', (err) => {
if (err) return console.error(err.message)
console.log('Connected to the "stock.db" SQlite database.')
})
module.exports = {
sale: function(formData, cartlist) {
const item = parseInt(formData, 10)
console.log(item)
const sql = "SELECT name, price FROM products WHERE barcode_id = " + item + ";"
console.log(sql)
console.log("test1")
db.all(sql, (err, data) => {
if(err) console.error(err.message)
console.log("test2")
cartlist = cartlist.concat(data)
console.log(cartlist)
})
console.log("test3")
return cartlist
}
}
index.js(相关部分)=
const sales = require('./sale.js')
。 。 。 .
var cartlist = []
app.post('/sales', async(req, res) => {
const formData = String(req.body.Barcode)
cartlist = await sales.sale(formData, cartlist)
console.log(cartlist)
res.render('cart', {purchases: cartlist})
})
。 。 .
我在那里进行了测试来显示顺序,首先记录 test1,然后记录 test3,然后返回 test2,显示它跳出,然后再次返回。不熟悉 SO 格式或 Node.js,所以提前道歉。我想这在某种程度上涉及回调函数,但我还没有完全理解它们是如何工作的。
最佳答案
您在 sale
函数上返回一个空数组。您需要了解 JS 的异步本质以及事件循环的工作原理。
为了让你的代码正常工作,你通常会使用 async/promise:
sale = function(formData, cartlist) {
return new Promise((resolve) => {
const item = parseInt(formData, 10)
const sql = 'SELECT name, price FROM products WHERE barcode_id = ' + item + ';'
db.all(sql, (err, data) => {
if (err) console.error(err.message)
console.log('test2')
cartlist = cartlist.concat(data)
resolve(cartlist)
})
})
}
关于javascript - NodeJS 和 Express - 导出函数跳过 SQLite3 DB 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53656704/