NodeJS和Express-导出功能会跳过SQLite3数据库查询

时间:2018-12-06 17:24:47

标签: javascript node.js express sqlite

尝试将一个单独的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,因此提前致歉。我想这有点涉及回调函数,但是我还没有完全了解它们是如何工作的。

2 个答案:

答案 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.allasync方法,因此,如果要暂停执行,则需要使用await方法。试试这个:

await db.all(sql, (err, data) => {
    if(err) console.error(err.message)
    console.log("test2")
    cartlist = cartlist.concat(data)
    console.log(cartlist)
})