尝试将一个单独的JS文件中的函数链接到我的索引,但是该函数的一部分被跳过,返回到index.js app.post方法,最后返回到它跳过的db查询另一个JS文件。
sales.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,因此提前致歉。我想这有点涉及回调函数,但是我还没有完全了解它们是如何工作的。
答案 0 :(得分:1)
您将在sale
函数上返回一个空数组。您需要了解JS的异步特性以及事件循环的工作原理。
为了使您的代码正常工作,通常使用异步/承诺:
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)
})
})
}
答案 1 :(得分:0)
我相信db.all
是async
方法,因此,如果要暂停执行,则需要使用await
方法。试试这个:
await db.all(sql, (err, data) => {
if(err) console.error(err.message)
console.log("test2")
cartlist = cartlist.concat(data)
console.log(cartlist)
})