javascript - NodeJS 和 Express - 导出函数跳过 SQLite3 DB 查询

标签 javascript node.js express sqlite

尝试将单独的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/

相关文章:

node.js - Docker Compose Django、Webpack 和构建静态文件

javascript - 获取所有连接的peer(Peer.js)

node.js - 使用mod_proxy在apache后面运行node.js时如何获取req.hostname

javascript - Typescript 功能可将 HTML 音频静音

javascript - 当 .load() 准备就绪时触发事件

javascript - Angular JS $log 和内存泄漏

angularjs - 使用 Nginx 服务器将 Node 应用程序隔离到单独的 URL

javascript - Mocha Chai - 确认 Body 中有一个 'name' 属性

node.js - 找不到模块 : Error: Cannot resolve 'file' or 'directory'

javascript - 从一个页面 URL 重定向到另一个页面